![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
Coder |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 733 Регистрация: 13.12.2004 Репутация: 5 Всего: 11 |
Собственно, насколько они эффективны в плане скорости скорости, размерам занимаемой памяти под служебные нужды и доступе к элементам? Чем массивы типа:
Пробывал тестировать, но для моего компьютера не получается придумать такой тест, где бы функция SetLength() работала медленнее GetMem() и где бы осуществлялось заметное отставание одних массивов от других при работае в цикле. Может у вас есть сведения по этой теме? |
|||
|
||||
ALeXandrK |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 342 Регистрация: 31.1.2007 Где: Санкт-Петербург Репутация: 3 Всего: 6 |
А ты посмотри какова разница в представлении на asm и по разнице
кол-ва строчек сможешь предположить разницу в скорости. -------------------- Богат не/ни тот, у кого много, а тот, кому хватает |
|||
|
||||
Coder |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 733 Регистрация: 13.12.2004 Репутация: 5 Всего: 11 |
ё маё...
Добавлено через 1 минуту и 34 секунды а "внутри " SetLength еще больше ASM инструкций.... Присоединённый файл ( Кол-во скачиваний: 25 ) ![]() |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
если память для дин.массива не перевыделяется, то имхо большой разницы по скорости работы с дин. или стат.масствами быть не должно.
-------------------- There are always someone smarter than you... |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Не буду утверждать, но слышал такое мнение что стековый массив работает быстре, якобы от того что лучше кэшируется кэшом процессора. Если кто-то имеет более подробную информацию, расскажите. Оч. полезно знать. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Провел эксперимент на таком коде
Проверка показала, что для стекового массива 100млн присваиваний произошли за 328мс, а для массива в куче за 406 мс, т.е. на целых 23% дольше! Похоже правду говорят про то что стек кешируеться лучше. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
EvilsInterrupt |
|
||||||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 3 Всего: 9 |
Иногда большое кол-во машинный инструкций приводит к более эффективному коду в плане скорости выполнения! Отсюда вывод, надо смотреть не на кол-во инструкций, а на кол-во конструкций c условным переходом, куда я отношу такие как jnX, jX. Этому есть разумный довод, процессор работает так:
1. Выборка новой команды 2. Декодирование команды выбранной в прошлом такте 3. Выполнение инструкции выполненной 2 мя тактами раньше. Но это всего лишь классический подход, в современных процессорах, все подругому. Но тем не менее этот подход можно использовать для приблизительной оценки эффективности кода. и так, если есть код:
Процессор не знает, что тактом раньше перед сравнением выбрана не верная конструкция и нужно на самом деле не then, else выполнять, в итоге идет очистка команд, чтобы выполнить else ! В итоге, если вы вставите меньше jne, je и др. команд перехода то код будет более эффективным, т.к. процессор будет точнее предсказывать ход выполнения кода. Еще раз замечу, современные процессоры, по другим механизмам работают, но классику не стоит забывать, она позволяет оценить код на глаз! ;) Добавлено через 5 минут и 43 секунды Вот еще выдержка из unit DCPsha512, компонента DCPcrypt v2.0 written by David Barton: Есть код:
и есть:
Как вы думаете, почему автор отказался от цикла? и всатвил все напрямую ? |
||||||
|
|||||||
Alix |
|
|||
![]() L45 ![]() ![]() Профиль Группа: Участник Сообщений: 581 Регистрация: 4.5.2005 Где: Pskov/Spb Репутация: 7 Всего: 23 |
ммм... а ты усреднял результаты? у меня они все время разные - то одно быстрее, то другое. Иногда в два раза. Это если с отключенной оптимизацией. Если с включенной, порядок наблюдается, но в среднем разница все же не 23%, а ~100%... -------------------- Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой High tech. Low live. (с) Gardner Dozois |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Я проводил несколько замеров и выбирал наименьшие. Другие результаты получаются из-за того что работу цикла прерывают другие процессы, потому верно брать не средние а именно наименьшие, т.е. те которые выполнялись непрерывно. Добавлено через 1 минуту и 19 секунд Если врубить оптимизацию, то компилятор вообще может выкинуть много чего, так что такое сравнение не всегда верное. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 13 Всего: 158 |
SetLength сделана для того, чтобы не делать руками освобождение, выделение, вычисление размера элементов, перенос данных, итд. в скорости чтения-записи таких массивов разницы никакой нет: кусок памяти - он и в африке кусок памяти.
|
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Ну да! Память памяти рознь. Одно дело память процессора, а другое системная память. Работают они с разной скоростью. А вот что окажется в этом кэше и когда, вот что интересно. Не зря же разница в 23%.
Добавлено через 2 минуты и 26 секунд Упс. неправильно понял ответ. Ну да конечно между GetMem и SetLength разницы нет, память будет выделена в любом случае в куче. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 13 Всего: 158 |
если говорить о разнице в скорости работы с кучей и со стеком, то у меня вырисовывается такая картинка: процессору фиолетово, что кэшировать - поэтому на довольно больших массивах разницы не будет. скорость обработки же небольших кусков данных, размещенных в стеке, обуславливается тем, что какой-то кусок стека практически постоянно пасется в кэше за счет активной работы с ним.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |