Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Разборки на тему Life  (Прочитано 6191 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« : 07-04-2008 07:53 » 

я, кстати, для обработки соседних клеток во всех похожих задачах таже предпочитаю 8 строк )  Они даже красивее цикла смотрятся, а что работают быстрее - это как-то само понятно )
Записан

Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #1 : 07-04-2008 14:38 » 

Леш - не совсем само собой. Тут сегодня зависит от компилятора. Нормальный должен при коротких циклах сам раскладывать из цикла в строки с фиксированными индексами, просто раньше это не работало. Особенно в турбо бейсике Улыбаюсь

А на С++ сегодня в gcc++ можешь проверить сам раскладку. Все циклы до 10 с несложным вложением будут выданы в асемблере как последовательные команды.
Скорость кстати повышается именно из за отсутствия лишней опреации привсаивания и отсутствия условных переходв (jump-ов).
Записан

А птичку нашу прошу не обижать!!!
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 07-04-2008 15:05 » 

Гром, ну ты не прав. Когда надо смотреть в 8 сторон, там ни о какой упорядоченности индексов (двух!) не идёт. Твоя просьба вот:
Код:
	int i;
int x;
int z;

for(i=0;i<5;i++)
{
x=x+z;
}

результат
Код:
76:       int i;
77:       int x;
78:       int z;
79:
80:       for(i=0;i<5;i++)
004045CC   mov         dword ptr [ebp-14h],0
004045D3   jmp         CReversi2View::CReversi2View+0BEh (004045de)
004045D5   mov         ecx,dword ptr [ebp-14h]
004045D8   add         ecx,1
004045DB   mov         dword ptr [ebp-14h],ecx
004045DE   cmp         dword ptr [ebp-14h],5
004045E2   jge         CReversi2View::CReversi2View+0CFh (004045ef)
81:       {
82:           x=x+z;
004045E4   mov         edx,dword ptr [ebp-18h]
004045E7   add         edx,dword ptr [ebp-1Ch]
004045EA   mov         dword ptr [ebp-18h],edx
83:       }
004045ED   jmp         CReversi2View::CReversi2View+0B5h (004045d5)
84:
....
....
....
154:      ...
004045EF   ...
004045F2   ...
Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #3 : 08-04-2008 04:06 » 

Алексей1153++, студия схавала код за будь здоров Улыбаюсь даже на строки не стала раскладывать тупо результат подставила, подстчитанный на этапе компиляции
вот:
Код:
void f()
{
int x = 1;
int z = 2;

for(int i = 0; i != 5 ; ++i)
{
x=x+z;
}
std::cout << x;
}

void f2()
{
int i;
int x = 1;
int z = 2;

for(i = 0; i < 5 ; i++)
{
x=x+z;
}
std::cout << x;
}

void f3(int x, int z)
{
for(int i = 0; i != 5 ; ++i)
{
x=x+z;
}
std::cout << x;
}

template <int c> int f4(int x, int z);

template <>
int f4<0>(int x, int z)
{
return x;
}

template <int c> int f4(int x, int z)
{
return z + f4<c-1>(x, z);
}

int _tmain(int argc, _TCHAR* argv[])
{

f();
004014B0  push        0Bh 
004014B2  mov         ecx,offset std::cout (4151F0h)
004014B7  call        std::basic_ostream<char,std::char_traits<char> >::operator<< (401320h)
f2();
004014BC  push        0Bh 
004014BE  mov         ecx,offset std::cout (4151F0h)
004014C3  call        std::basic_ostream<char,std::char_traits<char> >::operator<< (401320h)
f3(1, 2);
004014C8  push        0Bh 
004014CA  mov         ecx,offset std::cout (4151F0h)
004014CF  call        std::basic_ostream<char,std::char_traits<char> >::operator<< (401320h)
f3(1, 4);
004014D4  push        15h 
004014D6  mov         ecx,offset std::cout (4151F0h)
004014DB  call        std::basic_ostream<char,std::char_traits<char> >::operator<< (401320h)
std::cout << f4<5>(1,2);
004014E0  push        0Bh 
004014E2  mov         ecx,offset std::cout (4151F0h)
004014E7  call        std::basic_ostream<char,std::char_traits<char> >::operator<< (401320h)

return 0;
004014EC  xor         eax,eax
}
004014EE  ret             

gcc тоже повыкидывал циклы, но не стал делать инлайнинг функций(и это правильно, т.к. функции могут быть использованы из внешнего cpp) и еще пара различий есть, это с опцией -g, а что он делает без этой опции ваще не понял, вроде видны вызовы функций в ассемблерном коде, но он на них не прыгает, а почти сразу выходит после вызова f1 может внутрях, где чего еще спрятал.

но это уже оффтоп
« Последнее редактирование: 08-04-2008 04:33 от LogRus » Записан

Странно всё это....
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 08-04-2008 04:17 » 

LogRus, а у меня не студия что ли ? )

 а если ты их в качестве параметров передашь ? А не инициализируешь константами
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 08-04-2008 04:32 » 

вот это номер )) Что за тоска ? Профессия для всех!
Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #6 : 08-04-2008 04:35 » 

Алексей1153++, весь код программы привёл, VS.NET 2003 собирал Release с /O2
Записан

Странно всё это....
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 08-04-2008 04:46 » 

LogRus, где весь код, вот для вот этого ассемблер покажи Улыбаюсь
Код:
void f3(int x, int z)
{
for(int i = 0; i != 5 ; ++i)
{
x=x+z;
}
}
Записан

marat_
Шеф-повар
Опытный

ru
Offline Offline

« Ответ #8 : 08-04-2008 04:52 » 

нет. мужчина должен материальное в мир приносить, творить, создавать то, чем потомки смогут гордиться. а программы - ерунда, трата времени и сил. ничего нет недолговечнее кода, ну разве что обещания вечной любви.
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #9 : 08-04-2008 05:12 » 

LogRus, где весь код, вот для вот этого ассемблер покажи Улыбаюсь
Код:
void f3(int x, int z)
{
for(int i = 0; i != 5 ; ++i)
{
x=x+z;
}
}


Внимательней, читай Улыбаюсь

Код:
	f3(1, 2);
004014C8  push        0Bh 
004014CA  mov         ecx,offset std::cout (4151F0h)
004014CF  call        std::basic_ostream<char,std::char_traits<char> >::operator<< (401320h)
Записан

Странно всё это....
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 08-04-2008 05:36 » 

Логрус, да передай ты уже туда переменные, а не константы Улыбаюсь)) Шутю.

marat_, а деньги мужчина в сембю должен приносить ? Улыбаюсь На вечном/для потомков - денег не заработаешь. Да и нужны людям наши программы, например для охраны жилищ и магазинов, чтоп не разворовали всё до потомков Ага
Записан

Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #11 : 08-04-2008 06:48 » 

Леш, ты что-то косячишь с оптимизайией. Вот.
Улыбаюсь

Кстати - 8 сторон очень даже упорядочиваются Улыбаюсь
И плюс ко всему - jump сам по себе операция по тяжелее чем переход на след. строку.
Записан

А птичку нашу прошу не обижать!!!
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 08-04-2008 07:02 » 

Гром, может, дело в версии компилятора? Алексей1153++, если правильно помню, у тебя ведь в основном VS 6.0 используется?

Offtopic:
Может, тему про оптимизацию отделить и перекинуть в раздел C++? Ага
Поставлю в угол.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #13 : 08-04-2008 07:11 » new

я с оптимизацией не косячу )) Я вообще не прикасался к ней )) Всё по умолчанию в настройках . Ага, VC++6
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines