Всякие разные штуки сомнительной полезности сделанные в свободное от работы время.
Цикл в стиле Python
Запись от wvxvw размещена 17.12.2011 в 15:42
Где-то когда-то очень давно мне попалась на глаза интересная идея по оптимизации циклов. Не знаю почему именно она у меня ассоциируется с Python. Возможно, если вы лучше с ним знакомы, то поделитесь знаниями.
Идея заключалась в том, что вместо того, чтобы проверять условие выхода из цикла на каждом витке, выйти из цикла по ошибке. Некоторые ошибки, такие как RangeError в AS3 это оружие, которое редко когда удается использовать в мирных целях.
Ниже - мой тест производительности разных вариантов одного и того же цикла.
Поразительным образом, вариант с выходом по ошибке оказался на много быстрее остальных...
package { import flash.display.Sprite; import flash.utils.getTimer; public class PythonLoopTest extends Sprite { public function PythonLoopTest() { super(); this.test(); } private function test():void { var t:int; var vector:Vector.<int> = new Vector.<int>(1e7, true); for (var i:int = 1e7 - 1; i >= 0; i--) vector[i] = 1e7 - i; t = getTimer(); testPythonLoop(vector); trace(getTimer() - t); t = getTimer(); testFor(vector); trace(getTimer() - t); t = getTimer(); testWhile(vector); trace(getTimer() - t); t = getTimer(); testPlainFor(vector); trace(getTimer() - t); // 254 // 1186 // 1174 // 1191 } private static function testPythonLoop(vector:Vector.<int>):void { var position:int; try { for (;vector[position] = vector[position++];) { }; } catch (error:RangeError) { }; } private static function testFor(vector:Vector.<int>):void { for (var position:int = vector.length - 1; position >= 0; vector[position] = vector[position--]) { }; } private static function testWhile(vector:Vector.<int>):void { var position:int = vector.length - 1; while (position >= 0) vector[position] = vector[position--]; } private static function testPlainFor(vector:Vector.<int>):void { var size:int = vector.length; for (var position:int; position < size; vector[position] = vector[position++]) { }; } } }
Код:
#! /usr/bin/python numbers = [1, 2, 3] mask = 'key: %(key)u value: %(value)u' number = 0 print 'first loop:' for index in range(len(numbers)): print mask % { 'key': index, 'value': numbers[index] } print 'second loop:' try: while True: print mask % { 'key': number, 'value': numbers[number] } number += 1 except Exception, e: print 'finished'
Всего комментариев 14
Комментарии
18.12.2011 00:01 | |
А чем это вариант принципиально отличается от testPlainFor()? Ну, кроме того, что не заглядывает в последний элемент вектора Странно, как такой результат мог получиться.
Есть предположение, что влияют опкоды-указатели строки Надо бы потестить в релизном режиме, просто лень было перекомпилировать. |
|
Обновил(-а) wvxvw 18.12.2011 в 00:04
|
18.12.2011 00:15 | |
дада, в релизной флешке результат
232 175 161 162 а некоторые уже руки стали потирать как мы все ускорим/оптимизируем |
18.12.2011 00:40 | |
в этом раскладе да, но речь была о варианте for (var i:int = vec.length-1; i >=0; i--)
|
18.12.2011 01:09 | |
Цитата:
Сообщение от silin
в этом раскладе да, но речь была о варианте for (var i:int = vec.length-1; i >=0; i--)
|
18.12.2011 21:55 | |
Хочется возвратиться к машкодам? )
|
19.12.2011 15:05 | |
Так результаты wvxvw в дебаговом режиме и были представлены, иначе сразу же было видно, что писать просто не о чем.
|
Последние записи от wvxvw
- Dired - текстовый проводник по файловой системе (29.06.2013)
- Навигация по HTML с WASD (09.06.2012)
- JavaScript, все не так плохо (07.06.2012)
- Что такое tarball и чем его пакуют (11.04.2012)
- Критика Presentation Model (18.02.2012)