我已经编码了一个c#windows表单应用程序,其中有两个用于loops 喜欢下面:
List<int> My_LIST = new List<int>();
List<string> RESULT_LIST = new List<string>();
int[] arr = My_LIST.ToArray();
for (int i = 0; i < arr.Length; i++)
{
int counter = i;
for (int j = 1; j <= arr.Length; j++)
{
if (counter == arr.Length)
{
counter = 0;
}
sb.Append(arr[counter].ToString());
RESULT_LIST.Add(sb.ToString());
counter++;
}
sb.Clear();
}
我使用此代码将数组中的字符组合组合在一起。
当数组的长度获得3000或更多时,程序会卡住。我该如何解决此问题?
因为根据我的应用程序的需求,我的数组的大小必须很大。
首先,我使用了一个普通的字符串获取组合,而我的代码如下:
string s = "";
而不是这样:
StringBuilder sb = new StringBuilder();
我认为普通字符串的最大长度可能存在问题,因此我将其更改为StringBuilder
,但问题没有解决。
这个问题是可以解决的还是我应该使用替代方案?
您的程序不会卡住,而是花了很长时间才能完成,因为它仅在一个线程上运行。
您可能需要并行使用它的迭代可以并行运行。
我首先建议将外部循环并行,然后测试是否有任何性能改进,如果没有进行任何改进,也可以平行于内部循环。在大多数情况下,平行于循环的外部可以证明足够。
另外,请注意,使用StringBuilder
作为累加器,然后在循环中执行sb.Append(arr[counter].ToString());
是 sub-tim-Oftimal 。完全不要致电toString
,只需附加即可。
但是,当执行并行处理时,请记住StringBuilder
不是线程安全,因此,您最好使用String
,而不是尝试引入锁定或任何此类保留的东西StringBuilder
。
最后,您需要谨慎对待共享状态,因此,我建议您在执行并行处理时要考虑的事情进行一些研究。