Я не верю, что это дубликат, я искал его, но на самом деле понятия не имел, что назвать его точно.Почему петли не масштабируются равномерно?
Я хочу знать, почему цикл, который в десять раз больше, чем другой цикл, не требуется в десять раз больше времени для запуска.
Я делал некоторые тесты, чтобы попытаться выяснить, как сделать мой сайт более быстрым и реактивным, поэтому я использовал microtime()
до и после функций. На моем веб-сайте я не уверен, как вытащить списки строк таблицы с определенными атрибутами, не пропуская всю таблицу, и я хотел знать, было ли это то, что меня замедлило.
Таким образом, используя следующий цикл:
echo microtime(), "<br>";
echo microtime(), "<br>";
session_start();
$connection = mysqli_connect("localhost", "root", "", "") or die(mysqli_connection_error());;
echo microtime(), "<br>";
echo microtime(), "<br>";
$x=1000;
$messagequery = mysqli_query($connection, "SELECT * FROM users WHERE ID='$x'");
while(!$messagequery or mysqli_num_rows($messagequery) == 0) {
echo('a');
$x--;
$messagequery = mysqli_query($connection, "SELECT * FROM users WHERE ID='$x'");
}
echo "<br>";
echo microtime(), "<br>";
echo microtime(), "<br>";
я получил следующий вывод и подобные выходы:
0.14463300 1376367329
0.14464400 1376367329
0.15548900 1376367330
0.15550000 1376367330 < these two
[a's omitted, for readability]
0.33229800 1376367330 < these two
0.33230700 1376367330
~ 18-20 микросекунд, не так уж плохо, никто не заметит. Поэтому я подумал, что произойдет, когда мой сайт будет расти. Что произойдет, если у меня будет 10-кратное количество строк таблицы (10 000) для поиска?
0.11086600 1376367692
0.11087600 1376367692
0.11582100 1376367693
0.11583600 1376367693
[lots of a's]
0.96294500 1376367694
0.96295500 1376367694
~ 83-88 микросекунд. Почему это не 180-200 микросекунд? Нужно ли начинать и останавливать цикл или что-то еще?
UPDATE: Чтобы увидеть, был ли это MySql добавление переменных, я проверил его без MySql:
echo microtime(), "<br>";
echo microtime(), "<br>";
session_start();
$connection = mysqli_connect("localhost", "root", "W2072a", "triiline1") or die(mysqli_connection_error());;
echo microtime(), "<br>";
echo microtime(), "<br>";
$x=1000000;
while($x > 10) {
echo('a');
$x--;
}
echo "<br>";
echo microtime(), "<br>";
echo microtime(), "<br>";
Теперь кажется, что на один миллион, он занимает ~ 100 миллисекунд (? Справа) и на десять миллионов требуется ~ 480 миллисекунд. Итак, мой вопрос все еще стоит. Почему большие петли движутся быстрее? Это не важно, я не планирую весь свой дизайн сайта, основываясь на этом, но мне интересно.
Повторно проверьте свои устройства. Эти дельта времени составляют * миллисекунды *. ('0.332298 с - 0.155500 с = 0.176798 сек = 176.798 миллисекунд') –
Это не имеет ничего общего с циклом. Вы запрашиваете MySQL. Существует 100 факторов. – Brad
если ваш запуск того же запроса, то его кеширование на 'кеше запросов' даже не попал на диск для i/o – DevZer0