Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2009, 12:18   #1
optimist32
Новичок
Джуниор
 
Регистрация: 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. Это для нас является расточительной роскошью.
Внимание вопрос. Как используя подход ООП, создать быстрый и красивый код в критических приложениях?

Вот фун-ция перебора, хотя это не важно, тут вопрос только организации данных, полагаю.
  1. Код:
    
    while (true)
                {
    				p_tmp = p_activeCell->p_Neighbour[ p_activeCell->current_index];//index];
    				if (p_tmp->cell_value == 0) // если сосед свободен,
                    {
    					p_activeCell->current_index++;
                        currentValue++;
                        last[currentValue] = p_activeCell;// запомним в памяти ячейку из которой уходим
    					p_tmp->cell_value = currentValue;
    					p_activeCell = p_tmp;
                        isPozitive_lastMove = true;
    			    }
                    else //если сосед не свободен
                    {
                        //пытаемся наити сдедующиего свободного соседа этой ячейки
    					p_activeCell->current_index++;
    					while (p_activeCell->current_index == p_activeCell->count_Neighbour) 
                        {
    						//то возможно это тупик      
    						if (isPozitive_lastMove) //если прошлое движение было вперед, а щас мы отступаем - то тупик
    						{
    							total++;//   if (total == 2) {}
    							////      Stats_table[CurrentValue]++;
    						    if(total % tot_MIL_local == 0)
    								std::cout << total << std::endl;
    							
    						}
                            // до отступления обновим возможные ходы в ячейке из которой уходим
    					    p_activeCell->current_index = 0;
                            // трем значение в ячейке при отступлении
    					    p_activeCell->cell_value = 0;
                            isPozitive_lastMove = false;
    					    p_activeCell = last[currentValue] ;
                            if (--currentValue == 0 )//если вернулись в нулевый ход - значит перебрали всё
    						   return total;
                        }
    
                    }
                }
Изображения
Тип файла: bmp скорость в ооп.bmp (780.9 Кб, 171 просмотров)
optimist32 вне форума Ответить с цитированием
Старый 15.11.2009, 00:38   #2
optimist32
Новичок
Джуниор
 
Регистрация: 14.11.2009
Сообщений: 3
По умолчанию up

есть тут специалисты или этот форум мертвый
optimist32 вне форума Ответить с цитированием
Старый 15.11.2009, 00:47   #3
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

>>но 5 тактов и 7 тактов

наверное это связано с образованием неявного указателя (this) внутри объекта на самого себя и поэтому ничего с этим не поделаеш?...

а как с оптимизацией алгоритма перебора? или объявления членов статиками, чтоб не вызывался this?

ps. возможно я не прав...
counter вне форума Ответить с цитированием
Старый 15.11.2009, 01:33   #4
m0nax
Форумчанин
 
Аватар для m0nax
 
Регистрация: 25.09.2009
Сообщений: 534
По умолчанию

я совсем не гуру, но разве может ООП версия работать так же быстро хотя бы теоретически?
ООП ведь придуман не для оптимизации, а для удобства и ясности кода, при небольших потерях скорости
m0nax вне форума Ответить с цитированием
Старый 15.11.2009, 02:44   #5
optimist32
Новичок
Джуниор
 
Регистрация: 14.11.2009
Сообщений: 3
По умолчанию м

Цитата:
Сообщение от counter Посмотреть сообщение
>>но 5 тактов и 7 тактов

наверное это связано с образованием неявного указателя (this) внутри объекта на самого себя и поэтому ничего с этим не поделаеш?...

а как с оптимизацией алгоритма перебора? или объявления членов статиками, чтоб не вызывался this?

ps. возможно я не прав...
Спасибо, что четко поняли тему. Да это связанно как раз с этим this->
Получается только один выход, который я вижу. Создать локальные объекты-прокси внутри метода на его входе, а на выходе из него, скопировать
в реальные поля класса... Иначе сложно придумать что-то. Как Вам идея такая?

Дополнительный вопрос по теме. Почему компилятор не вставляет вместо конструкции

адресс =
this->class1->class2->class3->value

реальный адресс ячейки
move ecx, dword ptr[ адресс ]

а компилирует так

move eax, [this]
move edx, [eax + смещение_1]
move ecx, [edx + смещение_2]

и тока теперь в ecx у нас адрес!!!!!

PS: давайте посоревнуемся в оптимизации, я неуверен что даже весь отдел microsoft врядли улучшат этот код, хотябы на 1%
Эту версию можно смело засовывать в любые задачи по перебору...

Цитата:
Сообщение от m0nax Посмотреть сообщение
я совсем не гуру, но разве может ООП версия работать так же быстро хотя бы теоретически?
ООП ведь придуман не для оптимизации, а для удобства и ясности кода, при небольших потерях скорости
ООП - это всё современное корпоративное программирование. Врядли оно хоть сколько-нибудь ущербно

Последний раз редактировалось optimist32; 15.11.2009 в 02:48.
optimist32 вне форума Ответить с цитированием
Старый 15.11.2009, 04:15   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

в С++ не думаю что есть потери.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 15.11.2009, 04:43   #7
MasterGH
Пользователь
 
Аватар для MasterGH
 
Регистрация: 08.11.2009
Сообщений: 16
По умолчанию

Если гнаться за скоростью выполнения, то ни какого ООП - писать надо на С технологией CUDA. А также, скорее всего, с ассемблерными вставками.
MasterGH вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
почему так? помогите решить 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