2013-10-24 3 views
0

Если у нас есть два способа присвоения этой переменной, либоПочему нет, если еще быстрее, чем значение по умолчанию?

if(condition){ 
    var a = "Condition is true"; 
} else { 
    var a = "Condition is false"; 
} 

или

var a = "Condition is false"; 
if(condition){ 
    a = "Condition is true"; 
} 

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

Поскольку Javascript является языком, на котором я наиболее свободно, создали this jsperf, и кажется, что оба варианта примерно одинаково быстры. Почему это?

  • Является ли стоимость письменности переменной такой небольшой?
  • Включается ли оптимизация, которая делает оба случая равными? (В случае Firefox, кажется, оба случая являются равны!)

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

+1

обе строки должна быть встроена в коде, несмотря на это, так что технически, это просто назначение указателя внутри , 'mov eax, [location_of_string]'. это операция в 1 цикл и в великой схеме вещей, по существу «свободная». выполнение двух заданий может иметь «двойную» стоимость, но стоимость настолько микроскопическая, что в значительной степени неизмерима. –

+0

@Marc Является ли весь тестовый пример не очень маленьким, так что даже эта небольшая разница должна быть более заметной? – JustAPoring

ответ

2

Давайте соберем все, что может принять любое количество времени, не связанного с этим испытанием в установке:

condition = Math.floor(Math.random()*2); 
a = undefined; 
trueval = "Condition is true"; 
falseval = "Condition is false"; 

Теперь наши дела являются:

//------------------------ 
//Using else 
if(condition){ 
    a = trueval; 
} else { 
    a = falseval; 
} 
//------------------------ 
//Using a default value 
a = falseval; 
if(condition){ 
    a = trueval; 
} 
//------------------------ 
//Extra case for curiosity, using ?: 
a = condition ? trueval : falseval; 
//------------------------ 

here are the results И. В этом случае, если/else эквивалентно с?:, И подход с двумя присваиваниями действительно заметно медленнее , учитывая, что это единственное, что вы делаете. Отметим также, что это результат для Chrome и другие браузеры могут отличаться:

Using else:   42,623,032 
Using a default value: 35,654,982 
Using ?::    42,206,645 

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

+0

Я вижу! Однако, похоже, в Firefox результат обратный. Любая идея, почему это может быть? – JustAPoring

+0

Еще один вопрос, который у меня есть: В моей версии, почему обе строки обрабатываются независимо от того, используются ли они? – JustAPoring

+0

@ JustAPoring: Я не совсем уверен ... Я не знаю достаточно о его внутренних вещах, чтобы сказать. Я спросил в чате #jsapi IRC, увидит, отвечают ли они. О строках, я не уверен, будут ли оба обработаны, но по крайней мере один будет .. – Claudiu

1

Пожалуйста, избавитесь от рандомизации в бенчмарке: как вы знаете, если все математические randoms дали истину или ложь? Это крайне маловероятно *, что 100 образцов дают 50 истин и фальши.

Попробуйте это: http://jsperf.com/else-vs-defaule-value/5

* Например симулировать 100 образцов с 100 тестов работают:

var totals = new Array(100) 
var a = new Array(100) 

for (var j = 0; j < 100; ++j) { 
    for (var i = 0; i < 100; ++i) { 
     a[i] = !! Math.floor(Math.random() * 2); 
    } 
    totals[j] = a.filter(Boolean).length; 
} 

//Running the jsperf 100 times and only X were "fair" (had same amount of true as false) 
console.log(totals.filter(function(v){return v === 50}).length) 
+0

Ну, чем больше размер выборки, тем ближе к 0,5 она должна быть, и Я предположил, что эти контрольные показатели используют больший объем тестов, чем 100 ... – JustAPoring

+0

@ JustAPoring вы можете увидеть образцы правильно, когда вы сравниваете ... обычно 100 на макс. – Esailija

Смежные вопросы