Странный результат при тестировании скорости Math () в Firefox - PullRequest
0 голосов
/ 17 февраля 2020

Я получил странный результат теста, который я провел (Firefox Speci c) и Я хотел бы узнать больше о том, как / почему это результат.

Типичный результат выглядит следующим образом (10 миллионов элементов списка) (я запускал его несколько раз вручную, я не чувствовал, что нужно полностью использовать «модуль статистики»).

Результаты для Firefox 72.0.2 (64-разрядная версия) при Windows 7

itteration: 40 ms - timer stopped
__rounding: 14 ms - timer stopped
______ceil: 16 ms - timer stopped
_____floor: 15 ms - timer stopped

Наиболее странным является тест itteration.

«Эффективный» itteration код выглядит следующим образом: arrNumbers[index] = arrNumbers[index];, и этот код является частью ВСЕХ тестов, но другие части имеют функцию Math, обернутую вокруг правой части.

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

Сначала я подумал, что это «проблема» с числами с плавающей запятой, возможно, медленнее чем целые числа, поэтому я попытался назначить 1 (int), чтобы каждая функция работала с равными данными, но результат все тот же.


Код: (вероятно, не будет работать здесь, так как я использую console.time() Я думаю. Но вы можете просто скопировать его как есть, в текстовый файл и изменить расширение файла на .html и открыть его с помощью Firefox, нажмите F12, чтобы открыть инструмент контроля, и при необходимости перейдите на вкладку Console.

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width">
		<title>Title</title>
	</head>
	<body>
		<script>

			function makeNrArray(loopSize) {
				var arrNumbers = [];
				for (let index = 0; index < loopSize; index++) {
					arrNumbers[index] = 1; //Math.random();
				}
				return arrNumbers ;	
			}

			function testItterationSpeed(arrNumbers) {
				var arrLength = arrNumbers.length;

				console.time("itteration");
				for (let index = 0; index < arrLength; index++) {
					arrNumbers[index] = arrNumbers[index];
				}
				console.timeEnd("itteration");
			}

			function testRoundingSpeed(arrNumbers) {
				var arrLength = arrNumbers.length;

				console.time("rounding");
				for (let index = 0; index < arrLength; index++) {
					arrNumbers[index] = Math.round(arrNumbers[index]);
				}
				console.timeEnd("rounding");
			}

			function testCeilingSpeed(arrNumbers) {
				var arrLength = arrNumbers.length;

				console.time("ceil");
				for (let index = 0; index < arrLength; index++) {
					arrNumbers[index] = Math.ceil(arrNumbers[index]);
				}
				console.timeEnd("ceil");
			}

			function testFlooringSpeed(arrNumbers) {
				var arrLength = arrNumbers.length;

				console.time("floor");
				for (let index = 0; index < arrLength; index++) {
					arrNumbers[index] = Math.floor(arrNumbers[index]);
				}
				console.timeEnd("floor");
			}


			var loopSize = 10000000; // <---- Settings ;)

			let arrNumbers = makeNrArray(loopSize);
			testItterationSpeed(arrNumbers);

			arrNumbers = makeNrArray(loopSize);
			testRoundingSpeed(arrNumbers)

			arrNumbers = makeNrArray(loopSize);
			testCeilingSpeed(arrNumbers);

			arrNumbers = makeNrArray(loopSize);
			testFlooringSpeed(arrNumbers);
		</script>
	</body>
</html>

Другие результаты:

Результаты для Firefox 72.0.2 (64-бит) (То же, что и выше, только для полноты и простоты сравнения)

itteration: 40 ms - timer stopped
__rounding: 14 ms - timer stopped
______ceil: 16 ms - timer stopped
_____floor: 15 ms - timer stopped

Firefox снова, , но теперь назначено 1,5 (float) в качестве входных данных (вместо int, как указано выше) (Math.random () дает аналогичный результат)

itteration: 67 ms - timer stopped
__rounding: 33 ms - timer stopped
______ceil: 34 ms - timer stopped
_____floor: 32 ms - timer stopped

Результаты для Google Chrome Версия 80.0.3987.106 (64 бита)

itteration: 11.7060546875   ms
__rounding: 12.194091796875 ms
______ceil: 11.73681640625  ms
_____floor: 11.551025390625 ms

Результаты для Inte rnet Explorer 11.0.9600 ..... Обновление: 11.0

itteration:  37,3 ms
__rounding: 203,5 ms
______ceil:  85,9 ms
_____floor:  85,7 ms

1 Ответ

2 голосов
/ 17 февраля 2020

Я считаю, что на самом деле вы выполняете тесты.

Прежде всего, результаты не столь уж драматичны c для меня. В Chrome они почти идентичны, а в Firefox я вижу небольшое - но последовательное - увеличение времени на вашем итерационном тесте. Обычно это примерно на 5-15 мс дольше, но это согласованно, поэтому я сообщу вам, что это реально.

Если вы добавите Math.floor() в итерационный тест, вы все еще см. Более высокие цифры здесь.

Но если вы переместите итерационный тест до конца, например:

let arrNumbers = makeNrArray(loopSize);
testRoundingSpeed(arrNumbers)

arrNumbers = makeNrArray(loopSize);
testCeilingSpeed(arrNumbers);

arrNumbers = makeNrArray(loopSize);
testFlooringSpeed(arrNumbers);

arrNumbers = makeNrArray(loopSize);
testItterationSpeed(arrNumbers);

Тогда вы увидите testItterationSpeed результат go до диапазона других, в то время как testRoundingSpeed будет go вверх.

Я подозреваю, что это как-то связано с распределением памяти, поскольку в последующих результатах используется та же переменная (ну, та же самая let). Я не знаю деталей. Независимо от этого, речь идет не о том, что вы делаете, а о том, когда.

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