Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 26.02.2016, 09:13
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 11  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Только что обнаружил где я тупанул с тестом. Все таки FOR быстрее, чем FOR IN и FOR EACH IN.
Проблема теста здесь:
Код AS3:
for (i = 0; i < length; i++) {
	obj = array[i]; // вот тут я сделал присвоение, а надо было сразу обращаться к array[i].t 
	obj.t = 0;
}
Присвоение переменной и отжирало дополнительное время. Мой косяк.
Самый быстрый FOR (при условии, что длинна массива сразу записывается в переменную), на втором месте FOR EACH IN, а FOR IN - самый медленный.
Вот новый тест
Код AS3:
var i:int = 0;
var time:int = 0;
var vec:Vector.<Object> = new Vector.<Object>();
var arr:Array = [];
var length:int = 0;
var j:Object;
 
for (i = 0; i < 10000000; i++) {
	var obj:Object = { t: 0 };
	vec[i] = obj;
	arr[i] = obj;
}
 
var tf:TextField = new TextField();
tf.width = 800;
tf.height = 600;
addChild(tf);
 
// VECTOR TEST START
time = getTimer();
length = vec.length;
for (i = 0; i < length; i++) {
	vec[i].t = 1;
}
tf.appendText("Vector for i " + (getTimer() - time) + "\n");
// ARRAY TEST START
time = getTimer();
length = arr.length;
for (i = 0; i < length; i++) {
	arr[i].t = 2;
}
tf.appendText("Array for i " + (getTimer() - time) + "\n"); 
 
// VECTOR FOR EACH IN
time = getTimer();
for each (obj in vec) {
	obj.t = 3;
}
tf.appendText("Vector for each in " + (getTimer() - time) + "\n"); 
 
// ARRAY FOR EACH IN
time = getTimer();
for each (obj in arr) {
	obj.t = 4;
}
tf.appendText("Array for each in " + (getTimer() - time) + "\n"); 
 
// VECTOR FOR IN
time = getTimer();
for (j in vec) {
	vec[j].t = 3;
}
tf.appendText("Vector for in " + (getTimer() - time) + "\n"); 
 
// ARRAY FOR IN
time = getTimer();
for (j in arr) {
	arr[j].t = 4;
}
tf.appendText("Array for in " + (getTimer() - time) + "\n");
Результаты
Цитата:
Vector for i 430
Array for i 435
Vector for each in 620
Array for each in 609
Vector for in 671
Array for in 674
Но вот что меня немного удивило на этот раз, это то, что вектор не выдал какой-либо существенной разницы по сравнению с простым массивом на однотипных объектах.
__________________
Ко мне можно и нужно обращаться на ты)

Старый 26.02.2016, 10:16
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 12  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
Цитата:
Но вот что меня немного удивило на этот раз, это то, что вектор не выдал какой-либо существенной разницы по сравнению с простым массивом на однотипных объектах.
Если память не изменяет - вектор быстрее на простых типах (инты, числа).
Еще попробуй Object заменить на простой кастомный класс. Тоже должно появится немного буста, потому что сейчас ты обращаешься к динамическому свойству объекта, а не к полю класса.

Старый 26.02.2016, 10:19
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 13  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Цитата:
Но вот что меня немного удивило на этот раз, это то, что вектор не выдал какой-либо существенной разницы по сравнению с простым массивом на однотипных объектах.
Возможно потому, что Object вектор от массива по сути не отличается. Выигрыш вектора в том, что при строгой типизации, среде исполнения не нужно беспокоится о типах.
__________________
Дети не должны знать о своих родителях

Старый 29.02.2016, 15:45
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 14  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Цитата:
Сообщение от Tails Посмотреть сообщение
Ещё вот о чём я думал, так как класс Math. нативный, он может быть по разному реализован на разных архитектурах процессоров...
Исходный код Math доступен. На разных архитектурах, естественно будет работать немного по разному (касательно времени), но и скорость выполнения байткода (после JIT'a) будет меняться.
Есть и более зависимые вещи. Работа с временем, например. Для иллюстрации getTimer в iOS и Android зависит от системного времени, если перевести часы в системе, можно и отрицательное время словить.
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 29.02.2016, 15:55
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 15  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
alatar,
Ясно, большое спасибо!
__________________
Дети не должны знать о своих родителях

Старый 29.02.2016, 16:11
illuzor вне форума Посмотреть профиль Отправить личное сообщение для illuzor Найти все сообщения от illuzor
  № 16  
Ответить с цитированием
illuzor
 
Аватар для illuzor

Регистрация: Dec 2010
Адрес: Ярославль
Сообщений: 1,255
caseyryan, небольшой примечание: быстрей всего while. ASC2 при компиляции заменяет все for на while

Старый 29.02.2016, 21:02
СлаваRa вне форума Посмотреть профиль Отправить личное сообщение для СлаваRa Найти все сообщения от СлаваRa
  № 17  
Ответить с цитированием
СлаваRa
 
Аватар для СлаваRa

блогер
Регистрация: Feb 2008
Адрес: http://playtika.com
Сообщений: 1,119
Записей в блоге: 5
Отправить сообщение для СлаваRa с помощью ICQ Отправить сообщение для СлаваRa с помощью Skype™
Цитата:
Сообщение от Korchy Посмотреть сообщение
Обычно each-циклы не рекомендуют использовать из-за того, что не гарантируется порядок обхода. А по скорости ни разу не встречал таких рекомендаций.
а документацию вы читали про for-each циклы?
__________________
местонахождение

Старый 01.03.2016, 06:00
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 18  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Сообщение от alatar Посмотреть сообщение
Исходный код Math доступен. На разных архитектурах, естественно будет работать немного по разному (касательно времени), но и скорость выполнения байткода (после JIT'a) будет меняться.
Есть и более зависимые вещи. Работа с временем, например. Для иллюстрации getTimer в iOS и Android зависит от системного времени, если перевести часы в системе, можно и отрицательное время словить.

Исходный код метода parseInt просто жесть. Не задумывался даже, что для этого в реале требуется так много кода
Код AS3:
double MathUtils::parseInt(Stringp inStr, int32_t radix /*=10*/, bool strict /*=false*/ )
    {
        bool negate;
        bool gotDigits = false;
        double result = 0;
 
        StringIndexer s(inStr);
        int32_t index = skipSpaces(s, 0); // leading and trailing whitespace is valid.
        index = handleSign(s, index, negate);
        if (isHexNumber(s, index) && (radix == 16 || radix == 0) ) {
            index += 2;
            if (radix == 0)
                radix = 16;
        } else if (radix == 0) {
            // default radix is 10
            radix = 10;
        }
 
        // Make sure radix is valid, and we have digits
        if (radix >= 2 && radix <= 36 && index < s->length()) {
                result = 0;
                int32_t start = index;
 
                // Read the digits, generate result
                while (index < s->length()) {
                    int32_t v = parseIntDigit(s[index]);
                    if (v == -1 || v >= radix) {
                        break;
                    }
                    result = result * radix + v;
                    gotDigits = true;
                    index++;
                }
 
                index = skipSpaces(s, index); // leading and trailing whitespace is valid.
                if (strict && index < s->length()) {
                    return MathUtils::kNaN;
                }
 
            if ( result >= 0x20000000000000LL &&  // i.e. if the result may need at least 54 bits of mantissa
                    (radix == 2 || radix == 4 || radix == 8 || radix == 16 || radix == 32) )  {
 
                // CN:  we're here because we may have incurred roundoff error with the above.
                //  Error will creep in once we need more than the available 53 bits
                //  of precision in the mantissa portion of a double.  No way to deduce
                //  this from the result, so we have to recalculate it more slowly.
                result = 0;
 
                int32_t powOf2 = 1;
                for(int32_t x = radix; (x != 1); x >>= 1)
                    powOf2++;
                powOf2--; // each word contains one less than this # of bits.
                index = start;
                int32_t v=0;
 
                int32_t end,next;
                // skip leading zeros
                for(end=index; end < s->length() && s[end] == '0'; end++)
                    ;
                if (end >= s->length())
                    return 0;
 
                for (next=0; next*powOf2 <= 52; next++) { // read first 52 non-zero digits.  Once charPosition*log2(radix) is > 53, we can have rounding issues
                    v = parseIntDigit(s[end++]);
                    if (v == -1 || v >= radix) {
                        v = 0;
                        break;
                    }
                    result = result * radix + v;
                    if (end >= s->length())
                        break;
                }
                if (next*powOf2 > 52) { // If number contains more than 53 bits of precision, may need to roundUp last digit processed.
                    bool roundUp = false;
                    int32_t bit53 = 0;
                    int32_t bit54 = 0;
 
                    double factor = 1;
 
                    switch(radix) {
                    case 32:  // last word read contained digits 51,52,53,54,55
                        bit53 = v & (1 << 2);
                        bit54 = v & (1 << 1);
                        roundUp = (v & 1);
                        break;
                    case 16:  // last word read contained digits 50,51,52,53
                        bit53 = v & (1 << 0);
                        v = parseIntDigit(s[end]);
                        if (v != -1 && v < radix) {
                            factor *= radix;
                            bit54 = v & (1 << 3);
                            roundUp = (v & 0x3) != 0;  // check if any bit after bit54 is set
                        } else {
                            roundUp = bit53 != 0;
                        }
                        break;
                    case 8: // last work read contained digits 49,50,51, next word contains 52,53,54
                        v = parseIntDigit(s[end]);
                        if (v == -1 || v >= radix) {
                            v = 0;
                        }
                        factor *= radix;
                        bit53 = v & (1 << 1);
                        bit54 = v & (1 << 0);
                        break;
                    case 4: // 51,52 - 53,54
                        v = parseIntDigit(s[end]);
                        if (v == -1 || v >= radix) {
                            v = 0;
                        }
                        factor *= radix;
                        bit53 = v & (1 << 1);
                        bit54 = v & (1 << 0);
                        break;
                    case 2: // 52 - 53 - 54
                        /*
                        v = parseIntDigit(s[end++]);
                        result = result * radix;  // add factor before round-off adjustment for 52 bit
                        */
                        bit53 = v & (1 << 0);
                        v = parseIntDigit(s[end]);
                        if (v != -1 && v < radix) {
                            factor *= radix;
                            bit54 = (v != -1 ? (v & (1 << 0)) : 0); // Might be there are only 53 digits.
                        }
 
                        break;
                    }
 
                    bit53 = !!bit53;
                    bit54 = !!bit54;
 
 
                    while(++end < s->length()) {
                        v = parseIntDigit(s[end]);
                        if (v == -1 || v >= radix) {
                            break;
                        }
                        roundUp |= (v != 0); // any trailing positive bit causes us to round up
                        factor *= radix;
                    }
                    roundUp = bit54 && (bit53 || roundUp);
                    result += (roundUp ? 1.0 : 0.0);
                    result *= factor;
                }
 
            }
            /*
            else if (radix == 10 && result >= 0x20000000000000)
            // if there are more than 15 digits, roundoff error may affect us.  Need to use exact integer rep instead of float
            //int32_t numDigits = len - (s - sStart);
            */
            if (negate) {
                result = -result;
            }
        }
        return gotDigits ? result : MathUtils::kNaN;
    }
Что-то не нашел как вычисляются синусы и косинусы...

Цитата:
caseyryan, небольшой примечание: быстрей всего while. ASC2 при компиляции заменяет все for на while
Тогда еще небольшое примечание: так было всегда, ASC 2 тут ни при чем.
__________________
Ко мне можно и нужно обращаться на ты)

Старый 01.03.2016, 11:33
Korchy вне форума Посмотреть профиль Отправить личное сообщение для Korchy Найти все сообщения от Korchy
  № 19  
Ответить с цитированием
Korchy
 
Аватар для Korchy

Регистрация: May 2011
Сообщений: 301
Записей в блоге: 2
Цитата:
Сообщение от СлаваRa Посмотреть сообщение
а документацию вы читали про for-each циклы?
Вполне мог что-то и пропустить )
__________________
interplanety

Старый 01.03.2016, 12:32
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 20  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
а документацию вы читали про for-each циклы?
Только что прочитал, ожидая, что я упустил что-то, и порядок итерации в ней строгий. А нет, ничего не упустил, про порядок итерации ни слова. Он там не строгий. Так что я не понимаю к чему ты сказал про документацию
__________________
Ко мне можно и нужно обращаться на ты)

Создать новую тему Ответ Часовой пояс GMT +4, время: 13:47.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 13:47.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.