Что быстрее? Сравнение или назначение?

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

... Вместо этого я использовал инструмент инспектора Firebug, чтобы получить имя класса для этих объектов ползунка (возможно, t вспомнить, что это было сейчас - два случайных аббревиатуры в верхнем регистре), затем выполнил выражение в консоли Javascript, которое переключило состояние каждого слайдера. Что-то вроде:

switches = document.getElementsByClassName("ABC DEF"); for(i = 0; i < switches.length; i++) switches[i].click();

Это заморозило браузер в течение минуты или двух, но впоследствии каждый телефон был отмечен как неподдерживаемый. Затем вы можете включить телефон (ы), который вам нужно поддерживать.

35
задан cletus 27 May 2009 в 14:56
поделиться

8 ответов

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

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

19
ответ дан 27 November 2019 в 07:04
поделиться

Это не просто преждевременная оптимизация , это микрооптимизация , которая не имеет отношения к делу.

27
ответ дан 27 November 2019 в 07:04
поделиться

Изменить: я написал сценарий на PHP. Я только заметил, что в нем была явная ошибка, означающая, что время выполнения в лучшем случае вычислялось неправильно (страшно, что никто другой не заметил!)

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

Вывод:

  • назначение за 0,0119960308075 секунд
  • сравнение наихудшего случая за 0,0188510417938 секунд
  • сравнение наилучшего случая за 0,0116770267487 секунд

Код:

<?php
$arr = array();

$mtime = explode(" ", microtime());
$starttime = $mtime[1] + $mtime[0];

reset_arr($arr);

for ($i=0;$i<10000;$i++)
    $arr[i] = true;


$mtime = explode(" ", microtime());
$firsttime = $mtime[1] + $mtime[0];
$totaltime = ($firsttime - $starttime);
echo "assignment in ".$totaltime." seconds<br />"; 

reset_arr($arr);

for ($i=0;$i<10000;$i++)
    if ($arr[i])
        $arr[i] = true;

$mtime = explode(" ", microtime());
$secondtime = $mtime[1] + $mtime[0];
$totaltime = ($secondtime - $firsttime);
echo "worst case comparison in ".$totaltime." seconds<br />"; 

reset_arr($arr);

for ($i=0;$i<10000;$i++)
    if (!$arr[i])
        $arr[i] = false;

$mtime = explode(" ", microtime());
$thirdtime = $mtime[1] + $mtime[0];
$totaltime = ($thirdtime - $secondtime);
echo "best case comparison in ".$totaltime." seconds<br />"; 

function reset_arr($arr) {
    for ($i=0;$i<10000;$i++)
        $arr[$i] = false;
}
15
ответ дан 27 November 2019 в 07:04
поделиться

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

0
ответ дан 27 November 2019 в 07:04
поделиться

Можно попробовать:

if(!array[i])
    array[i]=true;

Но на самом деле единственный способ узнать наверняка - это профилировать, я уверен, что почти любой компилятор посчитает сравнение с false ненужным и оптимизирует

0
ответ дан 27 November 2019 в 07:04
поделиться

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

0
ответ дан 27 November 2019 в 07:04
поделиться

Как отмечали другие, это микрооптимизация .

(В политике или журналистике это называется пристальным вниманием; -)

Достаточно ли велика программа, чтобы иметь более пары уровней вызовов функций / методов / подпрограмм?

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

Если предположить, что вы удалили те (что делают немногие), то непременно запустите его. 10 ^ 9 раз по секундомеру и посмотрите, что быстрее.

0
ответ дан 27 November 2019 в 07:04
поделиться

Если вы просто хотите перевернуть значения, выполните:

array[i] = !array[i];

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

Если вы объявляете массив элементов из 1000000 истинных, ложных, истинных, ложных, сравнение образца происходит медленнее. (var b =! b) по сути выполняет проверку дважды, а не один раз

-1
ответ дан 27 November 2019 в 07:04
поделиться
Другие вопросы по тегам:

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