Есть ли более быстрый способ перебрать тысячи предметов? - PullRequest
5 голосов
/ 06 февраля 2012

Скажем, у меня есть байтовый массив с 100 000 байтов в нем.Я хочу преобразовать каждый байт в его текстовое представление о себе.Например:

byte[] b = new byte[55000];

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

Приведенный выше код занимает около 35 секунд, есть ли способ, которым я мог бы сократить это примерно до 5 секунд?

Ответы [ 3 ]

4 голосов
/ 06 февраля 2012

Как уже упоминалось в моем комментарии, я бы предложил удалить метод 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());
3 голосов
/ 06 февраля 2012

Мне нравится одна вещь - написать 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();
    }
0 голосов
/ 06 февраля 2012

Профилируйте свой код, чтобы увидеть, какой метод занимает больше всего времени. Сосредоточьте усилия по оптимизации на этом методе.

...