【问题标题】:Is there a faster way to loop through thousands of items?有没有更快的方法来遍历数千个项目?
【发布时间】:2012-02-27 16:20:05
【问题描述】:

假设我有一个包含 100,000 个字节的字节数组。我想将每个字节转换为其自身的文本表示。例如:

byte[] b = new byte[55000];

for(int i = 0; i < b.Length; i++)
{
Console.WriteLine(ConvertToString(b[i]));
}

上面的代码大约需要 35 秒才能完成,有什么方法可以将它缩短到 5 秒左右?

【问题讨论】:

  • 您是否尝试过使用除Console.WriteLine() 以外的其他东西或完全放弃它然后测试时间要求?即使它只是使用字符串生成器,然后在所有循环完成后输出字符串生成器字符串,它也应该有所帮助。

标签: c# loops bytearray


【解决方案1】:

我喜欢的一件事是写一个Parallel.For Loop 可能会比现在做得更快..

    static void Main()
    {
        int[] nums = Enumerable.Range(0, 1000000).ToArray();
        long total = 0;

        // Use type parameter to make subtotal a long, not an int
        Parallel.For<long>(0, nums.Length, () => 0, (j, loop, subtotal) =>
        {
            subtotal += nums[j];
            return subtotal;
        },
            (x) => Interlocked.Add(ref total, x)
        );

        Console.WriteLine("The total is {0}", total);
        Console.WriteLine("Press any key to exit");
        Console.ReadKey();
    }

【讨论】:

  • 需要注意的一点是,使用并行方法时顺序会发生变化。 .AsOrdered() 可能会有所帮助,但会导致性能损失。
  • 在这种情况下,顺序对于我正在做的事情非常重要。 Console.WriteLine() 将被其他函数替换。
【解决方案2】:

分析您的代码以查看哪种方法花费的时间最多。将您的优化工作集中在该方法上。

【讨论】:

    【解决方案3】:

    正如我在评论中提到的,我建议删除 Console.WriteLine() 方法。我还建议在循环中避免它。通常,如果您想查看正在处理的内容,您可以使用Debug.WriteLine() (MSDN) 或设置断点(如果您遇到无法正常工作的特定情况,甚至是条件断点)。如果您需要返回数据,那么我再次建议使用字符串生成器:

    byte[] b = new byte[55000];
    StringBuilder myStringBuilder = new StringBuilder();
    
    for(int i = 0; i < b.Length; i++)
    {
        myStringBuilder.AppendLine(ConvertToString(b[i]));
    }
    Console.Write(myStringBuilder.ToString());
    

    【讨论】:

    • 根据您的建议,我在 要求的 5 秒内完成了这项工作 - 很棒的工作,谢谢你,Gary。
    猜你喜欢
    • 2018-12-12
    • 1970-01-01
    • 1970-01-01
    • 2022-08-05
    • 1970-01-01
    • 2021-01-08
    • 2023-03-24
    • 2021-02-12
    • 1970-01-01
    相关资源
    最近更新 更多