Является ли один из них быстрее: if (! Foo <bar) if (foo> bar)? - PullRequest
3 голосов
/ 09 декабря 2011

Из любопытства. Я проверяю, превышает ли какая-либо строка максимальную указанную длину:

var name = "This Is a Name";
if (!name.length >= 10)
{
    //valid length
}
else
{
    alert("Too long");
}

Это лучше / быстрее (?):

if (name.length <= 10)

Я помню, что в некоторых языках лучше сначала написать отрицание, так что это даже лучше (да, я только что написал), вот так (?):

if (10 >= name.length)

Я знаю, что 10 перекрывается в коде - не обращайте на это внимания. Я просто хочу знать, есть ли какие-либо показатели / лучшие практики по этому вопросу.

Ответы [ 4 ]

3 голосов
/ 09 декабря 2011

Я почти всегда использую < и <= вместо > или >=. Я считаю, что всегда меньшее значение слева (при успешном выполнении теста) быстрее мысленно анализируется. Это также делает диапазон испытаний:

if (0 <= a && a < 10) …

читать больше как математический эквивалент 0 ≤ a <10. </p>

С точки зрения производительности, я был бы удивлен, если бы была какая-либо измеримая разница.

2 голосов
/ 09 декабря 2011

Это не в ваших руках, переводчик сделает все, что сочтет правильным.Интерпретаторы Javascript могут быть настолько продвинутыми, что в настоящее время они оптимизируют это, но, скорее всего, сами эти интерпретаторы компилируются с помощью компилятора, который оптимизировал бы сам перевод, так что это было даже в руках человека, который написал интерпретатор.

Так что на самом деле, если вам нужен язык, на котором вы хотите контролировать такое поведение, вам нужен asm.Даже в (оптимизированном) C вы действительно не контролируете это.

Единственное, что вы можете с уверенностью сказать, это то, что n.length > 9 может быть незначительно быстрее, поскольку содержит меньше символов , поэтомуразбираться быстрее.Мы говорим о наносекундах, может быть, даже пикосекундах.

1 голос
/ 09 декабря 2011

Позвольте мне прокомментировать ваш последний пример: я вполне уверен, что ваше соглашение if(10 >= name.length) было начато в эпоху предупреждений о плохом компиляторе C, чтобы избежать ошибок типа if(pointer = NULL) { error(); } else { i = *pointer; }, так как обратная версия будет сделать опечатку причиной ошибки компилятора. Это все еще удивительно актуально в JavaScript без jslint, но я не думаю, что это может повлиять на сравнения неравенства.

В остальном я также твердо нахожусь в лагере «без разницы», хотя я не экспериментировал, я просто не могу придумать вероятные причины, по которым порядок мог бы повлиять на производительность.

1 голос
/ 09 декабря 2011

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

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

if (name.length <= 10)

Если вы действительно хотите добиться максимальной производительности своего кода, вам придется написать несколько тестов; потому что говорить об этом вообще невозможно в большинстве случаев, например, почти каждая реализация JavaScript уже будет вести себя немного иначе.

Также обязательно проверьте «Преждевременная оптимизация», например, на википедии (см. раздел «Когда оптимизировать») .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...