【问题标题】:working with large string使用大字符串
【发布时间】:2012-05-24 20:34:48
【问题描述】:

我正在使用 C# 中的一个大字符串。例如,我的字符串长度是 2.000.000 个字符。我必须加密这个字符串。我必须将其保存为硬盘上的文本文件。我尝试使用 XOR 进行最快和基本的文本加密,但加密时间仍然太长。使用 2.13 GHz 双核 CPU 和 3 GB RAM 需要 1 小时。另外,保存文件(使用 StreamWriter Write 方法)和读取文件(使用 StreamReader ReadToEnd 方法)耗时太长。

代码:

public static string XorText(string text) 
{   
   string newText = ""; 
   int key = 1; 
   int charValue; 
   for (int i = 0; i < text.Length; i++) 
   {
     charValue = Convert.ToInt32(text[i]); //get the ASCII value of the character 
     charValue ^= key; //xor the value 
     newText += char.ConvertFromUtf32(charValue); //convert back to string 
   } 
   return newText; 
}

您对这些操作有何建议?

【问题讨论】:

  • 所以你想加密一个文本文件?
  • 为什么要调用 ConvertFromUtf32?我的意思是,这不像您首先调用 ConvertToUtf32 。这样一个人也可以去。
  • 为什么还要浏览文本?只是 XOR 字节?
  • 您的字符串只有 2 MB 大小。这绝不会占用 3 GB 的 RAM。并且做得对,这应该只需要几秒钟。还有一些事情你没有告诉我们。

标签: c# string performance optimization


【解决方案1】:

我建议对大字符串使用StringBuilder 而不是字符串,也最好显示您的代码以查看是否可以进行任何其他优化。例如,对于读取/写入文件,您可以使用缓冲区。

更新:正如我在您的代码中看到的(使用此代码)最大的问题是在这一行:

newText += char.ConvertFromUtf32(charValue);

Stringimmutable 对象,并且通过+= 运算符每次创建newText 的新实例时,当长度很大时,这会导致时间和内存问题,所以而不是string如果你使用StringBuilder,这行代码将是这样的:

newText.Append(char.ConvertFromUtf32(charValue));

而且这个函数会运行得非常快。

【讨论】:

  • @user1400531,请查看我的更新,最好不要删除您的评论以保留更新代码的历史记录。
  • 是的,+= 是个问题;它每次都会创建一个新字符串,因此总共会创建 2,000,000 个新字符串。但我不确定这是否是唯一的瓶颈。在 2GHz 机器上创建 2,000,000 个字符串需要一个小时吗?
  • @MrLister,我认为这会导致内存问题,并且在这种情况下垃圾收集器无法正常工作,而且是的,这不是系统中唯一的瓶颈,还有一些其他的瓶颈,例如 @987654332 @ 或 char.ConvertFromUtf32(charValue); 但我认为 += 是这里最大的问题。
猜你喜欢
  • 2021-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-15
  • 1970-01-01
  • 1970-01-01
  • 2021-10-19
相关资源
最近更新 更多