сравнение javascript, какой из них правильный и почему? [Дубликат]

Вы используете объект, содержащий ссылку нулевого значения. Таким образом, он дает пустое исключение. В примере строковое значение равно null, и при проверке его длины произошло исключение.

Пример:

string value = null;
if (value.Length == 0) // <-- Causes exception
{
    Console.WriteLine(value); // <-- Never reached
}

Ошибка исключения:

Необработанное исключение:

System.NullReferenceException: ссылка на объект не установлена ​​в экземпляр объекта. в Program.Main ()

264
задан Peter Mortensen 10 December 2009 в 21:03
поделиться

18 ответов

Быстрый ответ

В jQuery (более конкретно на Sizzle) мы используем этот (мастер проверки и открытая скорость / index.html в вашем браузере), который, в свою очередь, использует benchmark.js . Это используется для проверки производительности библиотеки.

Длинный ответ

Если читатель не знает разницы между эталоном, рабочей нагрузкой и профайлерами, сначала прочитайте некоторые основы тестирования производительности на вкладке "readme 1st" section of spec.org . Это касается тестирования системы, но понимание этих основ также поможет провести тестирование JS. Некоторые основные моменты:

Что такое эталон?

Тест является «стандартом измерения или оценки» (Словарь Вебстера II). Компьютерный тест обычно представляет собой компьютерную программу, которая выполняет строго определенный набор операций - рабочую нагрузку - и возвращает некоторую форму результата - метрику - описание способа выполнения тестируемого компьютера. Компьютерные контрольные показатели обычно измеряют скорость: насколько быстро была заполнена рабочая нагрузка; или пропускной способности: сколько единиц рабочей нагрузки за единицу времени было завершено.

Должен ли я тестировать собственное приложение?

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

Если не мое собственное приложение, то что?

Возможно, вы захотите рассмотреть возможность использования стандартных эталонных тестов в качестве контрольной точки. В идеале стандартизованный эталонный тест будет переносимым и, возможно, уже запущен на интересующих вас платформах. Однако перед тем, как вы рассмотрите результаты, вы должны быть уверены, что понимаете взаимосвязь между потребностями вашего приложения / компьютера и тем, что контрольный показатель измеряется. Являются ли эталоны похожими на виды приложений, которые вы запускаете? Имеют ли рабочие нагрузки аналогичные характеристики? На основе ваших ответов на эти вопросы вы можете начать понимать, как эталон может приблизиться к вашей реальности.

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

Тестирование производительности JS

В идеале, лучший перфекционный тест будет использовать ваше собственное приложение с вашим переключением рабочей нагрузки, что вам нужно проверить: разные библиотеки, машины и т. д.

Если это невозможно (и обычно это не так). Первый важный шаг: определите свою рабочую нагрузку. Он должен отражать рабочую нагрузку вашего приложения. В этот разговор Вячеслав Егоров говорит о дерьмовых нагрузках, которых вам следует избегать.

Затем вы можете использовать такие инструменты, как benchmark.js, чтобы помочь вам собирать показатели, обычно скорость или пропускную способность. В Sizzle мы заинтересованы в сравнении того, как исправления или изменения влияют на системную производительность библиотеки.

Если что-то работает очень плохо, следующим шагом будет поиск узких мест.

Как найти узкие места? Profiler

Каков наилучший способ профилировать выполнение javascript?

3
ответ дан Community 31 August 2018 в 13:39
поделиться

В настоящее время большинство браузеров выполняют синхронизацию с высоким разрешением в performance.now().

Использование

var start = performance.now();

// code being timed...

var duration = performance.now() - start;

Ссылки

31
ответ дан Daniel Imms 31 August 2018 в 13:39
поделиться

У меня есть небольшой инструмент, где я могу быстро запустить небольшие тестовые файлы в браузере и сразу получить результаты:

Проверка скорости JavaScript

Вы можете играть с кодом и узнать, какой метод лучше в тестируемом браузере.

9
ответ дан DUzun 31 August 2018 в 13:39
поделиться

JSLitmus - легкий инструмент для создания тестовых тестов ad-hoc для JavaScript

. Изучите производительность между function expression и function constructor:

<script src="JSLitmus.js"></script>
<script>

JSLitmus.test("new Function ... ", function() { 
    return new Function("for(var i=0; i<100; i++) {}"); 
});

JSLitmus.test("function() ...", function() { 
       return (function() { for(var i=0; i<100; i++) {}  });
});

</script>

То, что я сделал выше, это создать function expression и function constructor выполнение одной операции. Результат выглядит следующим образом:

Результат производительности FireFox

FireFox Performance Result [/g1]

Результат работы IE

IE Performance Result [/g2]

29
ответ дан Farray 31 August 2018 в 13:39
поделиться
  • 1
    Связанная страница JSLitmus содержит сломанные ссылки для загрузки. Я нашел JSLitmus (для браузеров) и jslitmus (для NodeJS, нижний регистр!). – Rob W 3 August 2012 в 15:31

Я согласен с тем, что воспринимаемая производительность действительно имеет значение. Но иногда я просто хочу узнать, какой метод делать что-то быстрее. Иногда разница ОГРОМНАЯ и стоит знать.

Вы могли бы просто использовать таймеры javascript. Но я обычно получаю гораздо более последовательные результаты, используя собственный Chrome (теперь также в Firefox и Safari) методы devTool console.time() & amp; console.timeEnd()

Пример того, как я его использую:

var iterations = 1000000;
console.time('Function #1');
for(var i = 0; i < iterations; i++ ){
    functionOne();
};
console.timeEnd('Function #1')

console.time('Function #2');
for(var i = 0; i < iterations; i++ ){
    functionTwo();
};
console.timeEnd('Function #2')

Results Look like this [/g4]

Обновление (4/4/2016):

Chrome canary недавно добавила Профилирование уровня линии вкладку источников инструментов разработчиков, которая позволит вам точно посмотреть, сколько времени каждая строка выполняла для выполнения!

151
ответ дан Jose Browne 31 August 2018 в 13:39
поделиться
  • 1
    Да, один из прелестей с этим заключается в том, что его можно быстро реализовать. Интересно, будут ли протоколы сами по себе выполнять некоторые из результатов выполнения javascript. Предположим, что у нас есть петля в игре, и она выводит несколько строк журнала. Например, один раз в секунду в течение 5 минут, то есть 300 строк. Кто-нибудь знает? – K. Kilian Lindberg 9 February 2014 в 13:37
  • 2
    Это все еще работает? Не отображается в Chrome. – in code veritas 22 January 2015 в 21:38
  • 3
    Я все еще работаю для меня. developer.chrome.com/devtools/docs/console-api#consoletimelabel – Jose Browne 23 January 2015 в 00:57

UX Profiler подходит к этой проблеме с точки зрения пользователя. Он группирует все события браузера, сетевую активность и т. Д., Вызванные действием пользователя (щелчок), и учитывает все аспекты, такие как латентность, таймауты и т. Д.

1
ответ дан Konstantin Triger 31 August 2018 в 13:39
поделиться

Профилисты - это, безусловно, хороший способ получить номера, но, по моему опыту, воспринимаемая производительность - это все, что важно для пользователя / клиента. Например, у нас был проект с расширенным аккордеонным расширением, чтобы показать некоторые данные, а затем несколько вложенных сеток Ext. Все было на самом деле очень быстро, ни одна операция не занимала много времени, было всего лишь много информации, которая была сделана сразу, поэтому она стала медленной для пользователя.

Мы исправили это, не переключаясь на более быстрый компонент или не оптимизируя какой-либо метод, а сначала представляя данные, а затем представляя сетки с помощью setTimeout. Таким образом, информация появилась первой, затем сетки появятся на месте второй позже. В целом, для этого потребовалось немного больше времени на обработку, но для пользователя улучшенная воспринимаемая производительность была улучшена.


EDIT: этот ответ теперь составляет 7 лет. В наши дни профилировщик Chrome и другие инструменты универсально доступны и просты в использовании, а также console.time() , console.profile() и performance.now() . Chrome также предоставляет вам представление временной шкалы, которое может показать вам, что убивает вашу частоту кадров, где пользователь может ждать, и т. Д.

Поиск документации для всех этих инструментов очень прост, вам не нужно Ответьте на это. 7 лет спустя, я еще повторю совет моего первоначального ответа и укажу, что вы можете иметь медленный код навсегда, где пользователь этого не заметит, и довольно быстрый код работает там, где они есть, и они будут жаловаться на довольно быстрый код не достаточно быстро. Или ваш запрос к API-интерфейсу сервера занимает 220 мс. Или что-то еще подобное. Дело в том, что если вы возьмете профилировщик и ищите работу, вы найдете ее, но это может быть не то, что вам нужно.

273
ответ дан Mosh Feu 31 August 2018 в 13:39
поделиться
  • 1
    да да да. Мне жаль, что я не смогу изменить вас на 2x ++ 1 – Byron Whitlock 10 December 2009 в 22:31
  • 2
    Это прекрасный шаг настройки после того, как хорошо известны хорошие алгоритмы исполнения. – Rafael Xavier 9 June 2014 в 18:56
  • 3
    Это действительно хороший ответ, поскольку он использует практический подход к большинству ситуаций, которые описывается в этом вопросе. Тем не менее, он не отвечает на вопрос , который спрашивает, есть ли другой способ измерить это, а не только восприятие пользователя. Все время простоя, например, когда кнопки заморожены, все еще можно измерить, используя методы в ответе pramodc и прилагаемые к нему комментарии. – RoboticRenaissance 10 December 2015 в 06:04

Некоторые люди предлагают определенные плагины и / или браузеры. Я бы не стал, потому что они действительно действительно полезны для этой платформы; тестовый прогон в Firefox не будет точно переводить на IE7. Учитывая, что 99.999999% сайтов посещают более одного браузера, вам нужно проверить производительность на всех популярных платформах.

Мое предложение состояло в том, чтобы сохранить это в JS. Создайте страницу сравнительного анализа со всем своим JS-тестом и временем выполнения. Вы даже можете получить AJAX-сообщение о результатах, чтобы сохранить его полностью автоматизированным.

Затем просто полоскайте и повторите на разных платформах.

15
ответ дан Oli 31 August 2018 в 13:39
поделиться
  • 1
    это верно, но профилировщики хороши, если есть проблема с кодированием, которая не имеет ничего общего с конкретной проблемой браузера. – John Boker 21 September 2008 в 18:02
  • 2
    Конечно! Да, они поймут общее «плохое кодирование». проблемы и специфические особенности отлично подходят для выполнения собственно отладки, но для общего тестирования на основе использования вы получите выгоду от чего-то, что работает на всех платформах. – Oli 21 September 2008 в 20:02
  • 3
    +1 на заметке, что это правда, но наличие профилировщика, такого как Firebug, по-прежнему велико, если не важно, для поиска узких мест. – Pekka 웃 10 December 2009 в 22:23
  • 4
    « Учитывая 99,999999% сайтов ... & quot; Я думаю, вы сделали это ...: - / – RobG 22 April 2016 в 06:17
  • 5
    @RobG Я могу переоценить десятичное место или два, но идея о том, что ваша платформа разработки, вероятно, не будет идентична вашей платформе развертывания. – Oli 22 April 2016 в 08:05

Я считаю, что время выполнения является наилучшей мерой.

3
ответ дан pdavis 31 August 2018 в 13:39
поделиться
  • 1
    В отличие от чего? Я не уверен, что понимаю. – Pekka 웃 10 December 2009 в 22:24
  • 2
    В отличие от вопроса о плакатах orignal: «Циклы процессора, использование памяти, время выполнения и т. Д.?»; – snicker 10 December 2009 в 22:30

Вы можете использовать это: http://getfirebug.com/js.html . Он имеет профилировщик для JavaScript.

7
ответ дан Peter Mortensen 31 August 2018 в 13:39
поделиться

Попробуйте jsPerf . Это онлайн-инструмент для работы с javascript для сравнения и сравнения фрагментов кода. Я использую его все время.

53
ответ дан Relax 31 August 2018 в 13:39
поделиться

Вот простая функция, которая отображает время выполнения переданной функции:

var perf = function(testName, fn) {
    var startTime = new Date().getTime();
    fn();
    var endTime = new Date().getTime();
    console.log(testName + ": " + (endTime - startTime) + "ms");
}
5
ответ дан sg7 31 August 2018 в 13:39
поделиться

Вот многоразовый класс для выполнения времени. Пример включен в код:

/*
     Help track time lapse - tells you the time difference between each "check()" and since the "start()"

 */
var TimeCapture = function () {
    var start = new Date().getTime();
    var last = start;
    var now = start;
    this.start = function () {
        start = new Date().getTime();
    };
    this.check = function (message) {
        now = (new Date().getTime());
        console.log(message, 'START:', now - start, 'LAST:', now - last);
        last = now;
    };
};

//Example:
var time = new TimeCapture();
//begin tracking time
time.start();
//...do stuff
time.check('say something here')//look at your console for output
//..do more stuff
time.check('say something else')//look at your console for output
//..do more stuff
time.check('say something else one more time')//look at your console for output
0
ответ дан Shawn Dotey 31 August 2018 в 13:39
поделиться

Мы всегда можем измерить время, затрачиваемое любой функцией на простой объект даты.

var start = +new Date();  // log start timestamp
function1();
var end =  +new Date();  // log end timestamp
var diff = end - start;
89
ответ дан theonlygusti 31 August 2018 в 13:39
поделиться
  • 1
    Обратите внимание, что это решение возвращает diff в миллисекундах – Chris Bier 4 February 2013 в 17:43
  • 2
    Использование Date () не рекомендуется, так как время в миллисекундах может меняться в зависимости от системных факторов. Вместо этого используйте console.time () и console.timeEnd (). См. Ответ JQuery Lover для получения более подробной информации. – mbokil 4 August 2013 в 22:22
  • 3
    Еще лучше, используйте performance.now() – edan 15 May 2014 в 16:00
  • 4
    Перед использованием performance.now () проверьте совместимость браузера. [Д0] developer.mozilla.org/en-US/docs/Web/API/Performance/… – AR_HZ 9 June 2016 в 15:11
  • 5
    Дата не является действительно показателем времени, которое прошло. Ознакомьтесь с этой статьей: sitepoint.com/measuring-javascript-functions-performance . Performance.now () - более точная отметка времени. – Millsionaire 2 March 2018 в 17:34

Это хороший способ сбора информации о производительности для конкретной операции.

start = new Date().getTime(); 
for (var n = 0; n < maxCount; n++) {
/* perform the operation to be measured *//
}
elapsed = new Date().getTime() - start;
assert(true,"Measured time: " + elapsed);
0
ответ дан user2601995 31 August 2018 в 13:39
поделиться

Я обычно просто проверяю производительность JavaScript, как долго работает скрипт. jQuery Lover дал хорошую ссылку для тестирования производительности javascript code , но в статье показано, как проверить, как долго работает ваш javascript-код. Я бы также рекомендовал прочитать статью под названием «5 советов по , улучшающих ваш код jQuery при работе с огромными наборами данных».

1
ответ дан Uzbekjon 31 August 2018 в 13:39
поделиться

Вы можете использовать console.profile в firebug

2
ответ дан Willem de Wit 31 August 2018 в 13:39
поделиться

Золотое правило заключается в том, чтобы НЕ под любыми обстоятельствами блокировать ваш браузер пользователей. После этого я обычно смотрю на время выполнения, за которым следует использование памяти (если вы не делаете что-то сумасшедшее, и в этом случае это может быть более высокий приоритет).

0
ответ дан William Keller 31 August 2018 в 13:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: