Оптимизация циклов
AS3, Заметки 19 мая , 2009
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | var arr:Array; const LEN:int = 500000; var t:Number; arr = createRandomArray(LEN); t = getTimer(); firstMethod(arr); trace("firstMethod:",getTimer() - t); t= getTimer(); secondMethod(arr); trace("secondMethod:",getTimer() - t); //---------------------------------- function firstMethod(arr:Array):void { for (var i:int = 0; i < arr.length; i++) { arr[i] = Math.random(); } } function secondMethod(arr:Array):void { var len:int = arr.length; for (var i:int = 0; i < len; i++) { arr[i] = Math.random(); } } function createRandomArray(len:int):Array { var arr:Array = new Array(); for (var i:int = 0; < len; i++) { arr[i] = Math.random(); } return arr; } |
//firstMethod: 213
//secondMethod: 158
13 августа, 2009 в 15:24
Оптимизировать, так оптимизировать полностью:
function thirdMethod(arr:Vector.):void {
var len:int = arr.length;
for (var i:uint = 0; i < len; i++) arr[i] = Math.random();
}
firstMethod: 344
secondMethod: 264
thirdMethod: 125
+3 пункта: Vector, uint для перебора и отсутствие фигурных скобок для цикла с одной строкой
13 августа, 2009 в 15:41
вордпрес скушал тип вектора)
11 февраля, 2010 в 1:11
Да вы оба молодцы.
function tMethod(arr:Array):void {
var len:uint = arr.length*0.5;
for (var i:uint = len; i > 2; i-=3)
arr[i] = Math.random();
arr[i-1] = Math.random();
arr[i-2] = Math.random();
}
firstMethod: 228
secondMethod: 239
tMethod: 30
1. Использовать uint везде где нужны целые,но неотрицательные числа.
2. Всегда предпочтительнее – чем +
3. Всегда предпочтительнее — чем -= или =-
4. Если есть возможность – развертывайте циклы
11 февраля, 2010 в 1:13
ой…кинул версию с ошибкой
function tMethod(arr:Array):void {
var len:uint = arr.length*0.25;
for (var i:uint = len; i > 3; i-=4)
arr[i] = Math.random();
arr[i-1] = Math.random();
arr[i-2] = Math.random();
arr[i-3] = Math.random();
}
firstMethod: 229
secondMethod: 237
tMethod: 13
19 февраля, 2010 в 14:47
попробуйте заменить это:
var len:uint = arr.length*0.25;
на
var len:uint = arr.length>>2;
Ещё чучуть быстрее, всё зависит от компилятора конечно.