![]() |
|
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]()
|
|
| Zozik |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 22.7.2008 Репутация: нет Всего: нет |
Помогите ускорить работу программы. Суть программы такова: Она рисует рисунок по пикселям. Каждому пикселю присваивается цвет в зависимости от значения числа. Чтобы вычислить значение числа нужно произвести в среднем 15-25 вычислений(может доходить и до 100). Пусть у нас рисунок 500 на 500 пикселей и того 500*500*20=5 000 000 вычислений. Мне любыми методами нужно ускорить работу программы.
И еще, обьясните почему так. Например рисую рисунок 200 на 200 - это занимает 1406 ms времени. Запускаю программу без вывода графики - это занимает 330 ms(только исчисления). Запускаю программу без вычислений, только вывод рисунка(значения генерирую с помощью random) - это занимает 110 ms. 330+110 не равно 1406
|
||||
|
|||||
| THandle |
|
|||
![]() Хранитель Клуба Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 50 Всего: 372 |
Первое что могу сказать по коду - это надо избавиться от строк и переводов(StrToХХХ). Довольно много времени будут брать, да еще и в цикле.
Второе: избавиться от goto, с его присутствием отпадает всякое желание читать код дальше. |
|||
|
||||
| Zozik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 22.7.2008 Репутация: нет Всего: нет |
Думаю что от строк никак не избавлюсь, так как я считываю выражение(строку) с формы, а потому и проблематично без переводов (StrToХХХ).
Goto использую для того чтобы исбечь деление на ноль(точка автоматически закрасывается в чорный цвет и кидает в конец цыкла) |
|||
|
||||
| THandle |
|
||||
![]() Хранитель Клуба Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 50 Всего: 372 |
А зря. ИМХО, все эти переводы и занимают большую часть времени.
А для Чего continue, break? Я за все время своей программерской деятельности ни разу не нашел места куда бы всунуть goto... А со всеми этими переходами становится довольно трудно поянть что к чему в коде. Да, кстати, скомпилировать все это дело у меня не получается из-за(прикреплено в файле). Просьба выложить полный код и прислушаться таки к моим первым двум советам, после этого можно будет уже думать об оптимизации... Присоединённый файл ( Кол-во скачиваний: 5 )
1.txt 3,01 Kb |
||||
|
|||||
| Zozik |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 22.7.2008 Репутация: нет Всего: нет |
Ниже прикрепил модуль Compl - модуль по рпботе над комплексными числами Присоединённый файл ( Кол-во скачиваний: 5 )
Compl.rar 6,64 Kb |
||||
|
|||||
| Zozik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 22.7.2008 Репутация: нет Всего: нет |
THandle, Спасибо большое, сумел заменил основную часть StrToХХХ и программа ускорила свою роботу в среднем на 73%. Все StrToХХХ заменить не смог, да и в цыкле их не осталось. Но от еще большего ускорения я не откажусь
Если есть идеи посоветуйте) |
|||
|
||||
| VICTAR |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1108 Регистрация: 6.10.2006 Репутация: 10 Всего: 80 |
Весь код не смотрел, лениво, сорри.
Могу посоветовать заменить Pixels на ScanLine. |
|||
|
||||
| THandle |
|
|||
![]() Хранитель Клуба Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 50 Всего: 372 |
Zozik, дальше совет VICTAR'а плюс уменьшение количества copy/delete. Они довольно медленно работают
|
|||
|
||||
| Zozik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 22.7.2008 Репутация: нет Всего: нет |
А где можно почитать про этот ScanLine, а то нашел пару статеек но мало что понял(
|
|||
|
||||
| VICTAR |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1108 Регистрация: 6.10.2006 Репутация: 10 Всего: 80 |
||||
|
||||
| Zozik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 22.7.2008 Репутация: нет Всего: нет |
Убрал Goto, заменил Pixels на ScanLine(+15% ускорение), copy/delete не менял - в цыкле у меня не встречаются, а все что за цыклом времени не занимает(по крайней мере писалось 0 ms). Исчисления в цыкле занимают более чем 90% времени.
Это сообщение отредактировал(а) Zozik - 11.8.2008, 17:54 |
|||
|
||||
| THandle |
|
|||
![]() Хранитель Клуба Награды: 1 Профиль Группа: Админ Сообщений: 3639 Регистрация: 31.7.2007 Где: Moscow, Dubai Репутация: 50 Всего: 372 |
Zozik, там уже практически никак не ускоришь. Так как там все занимают довольно сложные вычисления. В них уж разбираться только тебе
Можно все деления, умножения заменить на сдвиг, ноя не думаю что это сильно ускорит. Оставшиеся 10% ускорить можно, убрав из циклов while copy/delete/pos. Да, и еще, слово "цыкл" пишется через "и". |
|||
|
||||
| Coder |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 733 Регистрация: 13.12.2004 Репутация: 2 Всего: 11 |
а while это не цикл? обязательно избавься от delete. Для чего можешь почитать тут - http://forum.vingrad.ru/forum/topic-210801/unread-1.html |
|||
|
||||
| Zozik |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 22.7.2008 Репутация: нет Всего: нет |
Coder, Я имел ввиду главный цикл. В том цикле где встречается delete/copy много считать не нужно, гдето 2-3 раза(засекал время - писалось 0 ms). Ну потом исправлю если получется, попозже.
VICTAR, THandle, Coder, Всем большое спасибо!) |
|||
|
||||
![]()
|
| Правила форума "Delphi: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |