Почему этот метод JavaScript превосходит мой метод C #? - PullRequest
0 голосов
/ 02 ноября 2019

В настоящее время я тестирую производительность определенных операций со списками в C# и JavaScript, чтобы определить разрыв между ними.

В настоящее время я тестировал скорость добавления элементав список в C# и JavaScript. Здесь я обнаружил, что каким-то образом JavaScript смог превзойти C#, хотя мое предварительное исследование показало, что C# должно быть немного быстрее.

C#:

            var time = Stopwatch.StartNew();
            var loops = 10000000;
            var strList = new List<string>();
            time.Start();
            for (var i = 0; i < loops; i++)
            {
                strList.Add("Loop" + i);
            }
            time.Stop();
            Console.WriteLine("TIME: " + time.ElapsedMilliseconds + "ms");

JS:

    var t0 = performance.now();
    var loops = 10000000
    strList = []
    for(var i = 0; i < loops; i++)
    {
        strList.push("Loop" + i);
    }
    var t1 = performance.now();
    console.log("TIME: " + (t1-t0) + "ms");

Я заметил, что когда я заменил функцию strList.push("Loop" + i); на обоих языках на strList.push("Loop") (без индекса) производительность выросла на огромную величину.

With index:
C#:
-3805ms

JavaScript:
- Chrome: 6048ms
- Firefox: 1248ms

Without index:
C#:
-166ms

JavaScript:
- Хром: 348ms
- Firefox: 154ms

Подводя итог, мой вопрос: почему C # выполняет JavaScript, когда JS запускается на Firefox? И почему добавление индекса в список приводит к такому экстремальному снижению производительности? Есть ли другой способ сделать это быстрее?

Заранее спасибо!

1 Ответ

0 голосов
/ 02 ноября 2019

Интересно, что я сделал несколько проверок и обнаружил, что ваше утверждение соответствует моим выводам (реализация на C # медленнее). Насколько я могу объяснить, назначение целевой коллекции и установка нового значения в цикле немного избыточны, и это поглощает время. Кроме того, ваш вариант с индексом в имени цикла или без него медленнее, потому что строка должна быть создана снова, хотя string.format или string.concat не имеют никакого значения. Тем не менее, я не Джон Скит, и мне нравится знать точную причину.

Если вы рассматриваете подход LINQ, мое новое время было около 12 миллисекунд

  var time = Stopwatch.StartNew();
    var loops = 10000000; 
    time.Start();
    var strList = Enumerable.Range(0, loops).Select(i => $"Loop{i}");

    time.Stop();
    Console.WriteLine("TIME: " + time.ElapsedMilliseconds + "ms");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...