![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Новичок
Джуниор
Регистрация: 14.11.2009
Сообщений: 3
|
![]()
ГУРУ ПОМОГИТЕ РАЗОБРАТЬСЯ
Написал классическую прогу по перебору с возвратом, на примере игры "Ход конём". Понял, что управляемый код не для таких программ, где важен каждый такт процессора. Вариант 1: Можно сказать без ООП. Описал глобальные переменные. Написал функцию перебора. глобальные данные... Perebor(); В обоих случаях функция "висячая", тоесть работает по типу while(true) { //тут перебор идет, используя только наши данные } Вызываем фун-цию получаем 10.5 миллионов в секунду. Вариан 2: С ООП. Создал класс Desk. Описал те же данные, но внутри класса Desk. Создал метод перебора. Потом делаю так. Desk desk = new Desk(6,6); desk.Perebor(minMove); Perebor - начинает работать с полями своего класса, получаем скорость уже 6 миллионов в секунду Заглянул в ассемблерский код, увидел там следущее(см. картинку во вложении) Тоесть присутствуют лишние mov, чтобы указать на this нашего класса Desk. Это для нас является расточительной роскошью. Внимание вопрос. Как используя подход ООП, создать быстрый и красивый код в критических приложениях ![]() Вот фун-ция перебора, хотя это не важно, тут вопрос только организации данных, полагаю.
|
![]() |
![]() |
![]() |
#2 |
Новичок
Джуниор
Регистрация: 14.11.2009
Сообщений: 3
|
![]()
есть тут специалисты или этот форум мертвый
|
![]() |
![]() |
![]() |
#3 |
Участник клуба
Регистрация: 18.10.2008
Сообщений: 1,409
|
![]()
>>но 5 тактов и 7 тактов
наверное это связано с образованием неявного указателя (this) внутри объекта на самого себя и поэтому ничего с этим не поделаеш?... а как с оптимизацией алгоритма перебора? или объявления членов статиками, чтоб не вызывался this? ps. возможно я не прав... |
![]() |
![]() |
![]() |
#4 |
Форумчанин
Регистрация: 25.09.2009
Сообщений: 525
|
![]()
я совсем не гуру, но разве может ООП версия работать так же быстро хотя бы теоретически?
ООП ведь придуман не для оптимизации, а для удобства и ясности кода, при небольших потерях скорости |
![]() |
![]() |
![]() |
#5 | ||
Новичок
Джуниор
Регистрация: 14.11.2009
Сообщений: 3
|
![]() Цитата:
Получается только один выход, который я вижу. Создать локальные объекты-прокси внутри метода на его входе, а на выходе из него, скопировать в реальные поля класса... Иначе сложно придумать что-то. Как Вам идея такая? Дополнительный вопрос по теме. Почему компилятор не вставляет вместо конструкции адресс = this->class1->class2->class3->value реальный адресс ячейки move ecx, dword ptr[ адресс ] а компилирует так move eax, [this] move edx, [eax + смещение_1] move ecx, [edx + смещение_2] и тока теперь в ecx у нас адрес!!!!! PS: давайте посоревнуемся в оптимизации, я неуверен что даже весь отдел microsoft врядли улучшат этот код, хотябы на 1% ![]() Эту версию можно смело засовывать в любые задачи по перебору... Цитата:
![]() Последний раз редактировалось optimist32; 15.11.2009 в 02:48. |
||
![]() |
![]() |
![]() |
#6 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
в С++ не думаю что есть потери.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
![]() |
#7 |
Пользователь
Регистрация: 08.11.2009
Сообщений: 16
|
![]()
Если гнаться за скоростью выполнения, то ни какого ООП - писать надо на С технологией CUDA. А также, скорее всего, с ассемблерными вставками.
|
![]() |
![]() |
![]() |
Опции темы | Поиск в этой теме |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
почему так? помогите решить | evgenrpo | Общие вопросы C/C++ | 6 | 31.05.2009 22:43 |
задача поменять в массиве max элемент с первым, но меняет как то не так.. почему? | Валюшка | Помощь студентам | 2 | 21.01.2009 01:46 |
Почему так происходит? | Zeraim | Общие вопросы Delphi | 1 | 05.05.2008 14:10 |
Почему так? | Сильванович Михаил | Общие вопросы C/C++ | 2 | 03.07.2007 11:57 |
Обьясните почему так... | malevich | Общие вопросы Delphi | 5 | 10.02.2007 17:29 |