|
|
|||||
Заблуждения в оптимизации
Создал эту тему просто, чтобы поделиться опытом своих заблуждений)
Сам код для потимизации stage3d оставлю, меня заинтересовало то, что он рекомендовал избегать использования for each циклов, и заменять их на for var i:int ... Но мои замеры показали, что разница в скорости между этими циклами составляет почти 3 раза! Причем совсем не в пользу вторых. Тест содержит ошибку, ответ здесь Вот мой тест на 10 миллионах объектов // создаем 10 миллионов объектов с одним свойством var array:Array = [] for (var i:int = 0; i < 10000000; i++) { array.push( { t: 1 } ); } var length:int = array.length; var obj:Object = null; var time:int = getTimer(); for (i = 0; i < length; i++) { obj = array[i]; obj.t = 0; } trace("FOR i", getTimer() - time); // 1554 time = getTimer(); for each (obj in array) { obj.t = 0; } trace("FOR EACH", getTimer() - time); // 671 Вот еще пример public function MathCrap() { var number:Number = -14; var i:int = 0; var result:Number = 0; var time:int = 0; time = getTimer(); for (i = 0; i < 10000000; i++) { result = Math.abs(number); } trace("Math.abs()", getTimer() - time); time = getTimer(); for (i = 0; i < 10000000; i++) { result = abs(number); } trace("Inline abs", getTimer() - time); trace("CEIL >>>"); number = 1.5; time = getTimer(); for (i = 0; i < 10000000; i++) { result = Math.ceil(number); } trace("Math.ceil()", getTimer() - time); time = getTimer(); for (i = 0; i < 10000000; i++) { result = ceil(number); } trace("Inline ceil", getTimer() - time); } [Inline] public static function abs(value:Number):Number { return value > 0 ? value : -value; } [Inline] public static function ceil(value:Number):int { return int(value) + 1; } То есть совсем незначительная разница, хотя я расчитывал увидеть цифры раза в 2, а то и в 3 различающиеся. Видимо Адоби хорошо поработали над оптимизацией кода в ASC 2.0
__________________
Ко мне можно и нужно обращаться на ты) Последний раз редактировалось caseyryan; 26.02.2016 в 09:15. |
|
|||||
Обычно each-циклы не рекомендуют использовать из-за того, что не гарантируется порядок обхода. А по скорости ни разу не встречал таких рекомендаций.
__________________
interplanety |
|
|||||
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
Результаты в DEBUG и RELEASE версиях плеера могут сильно отличаться. Судя по трейсам использовался именно дебажный вариант
__________________
Загружаем картинки, минуя ошибки безопасности |
|
|||||
Цитата:
Вот цитата Дэниэла Цитата:
Цитата:
Сделал релизный тест, и мои изначальные ожидания оправдались с лихвой. Вот для релиза: public function MathCrap() { var tf:TextField = new TextField(); tf.width = 800; tf.height = 600; addChild(tf); var number:Number = -14; var i:int = 0; var result:Number = 0; var time:int = 0; time = getTimer(); for (i = 0; i < 10000000; i++) { result = Math.abs(number); } tf.appendText("Math.abs() " + (getTimer() - time) + "\n"); time = getTimer(); for (i = 0; i < 10000000; i++) { result = abs(number); } tf.appendText("Inline abs " + (getTimer() - time) + "\n"); tf.appendText("CEIL >>>"); number = 1.5; time = getTimer(); for (i = 0; i < 10000000; i++) { result = Math.ceil(number); } tf.appendText("Math.ceil() " + (getTimer() - time) + "\n"); time = getTimer(); for (i = 0; i < 10000000; i++) { result = ceil(number); } tf.appendText("Inline ceil " + (getTimer() - time) + "\n"); } [Inline] public static function abs(value:Number):Number { return value > 0 ? value : -value; } [Inline] public static function ceil(value:Number):int { return int(value) + 1; } Никогда не думал, что придется настолько заморачиваться с оптимизацией приложений)
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
Цитата:
А вот с ceil при приведений Number к int мы можем потерять информацию, если число будет за диапазоном int. Мы так-же потеряем Infinity и NaN в обоих случаях. И ещё, неужели весь остальной код в игре уже так идеально оптимизирован, что пришлось взяться за нативные реализаций?
__________________
Дети не должны знать о своих родителях |
|
|||||
Цитата:
Цитата:
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
Если получиться ускорить ceil, round с поддержкой Number, ты обязательно напиши.
Цитата:
Ещё вот о чём я думал, так как класс Math. нативный, он может быть по разному реализован на разных архитектурах процессоров. Где-то быстрее, где то медленнее. В то время как собственная, кастомная реализация везде будет одинаковой по скорости. Я к тому, что было бы здорово, после написания теста, прогнать его на разных устройствах, в том числе web player конечно! )
__________________
Дети не должны знать о своих родителях |
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
Цитата:
|
|
|||||
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
Вычисление целой и дробной части не на интах будет примерно таким
Для round() floor() и ceil() можно допереть)
__________________
Загружаем картинки, минуя ошибки безопасности |
Часовой пояс GMT +4, время: 07:18. |
|
« Предыдущая тема | Следующая тема » |
|
|