Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Что быстрее?  (Прочитано 791 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн [DarkNet]Alpha

  • Автор темы
  • Активист
  • *
  • Сообщений: 987
  • Эмоциональный эльдар
    • Просмотр профиля
    • EBM-радио
Что быстрее?
« : 11 Августа 2012, 17:52:30 »
char cc[] = "qwerty";
bool b1 = strchr(cc, 'a');
bool b2 = (strchr(cc, 'a') != 0);
bool b1 = strchr(cc, 'a');
00352774  push        61h 
00352776  lea         eax,[ebp-10h] 
00352779  push        eax 
0035277A  call        strchr (351177h)
0035277F  add         esp,8 
00352782  test        eax,eax 
00352784  setne       cl 
00352787  mov         byte ptr [ebp-19h],cl 
bool b2 = (strchr(cc, 'a') != 0);
0035278A  push        61h 
0035278C  lea         eax,[ebp-10h] 
0035278F  push        eax 
00352790  call        strchr (351177h) 
00352795  add         esp,8 
00352798  neg         eax 
0035279A  sbb         eax,eax 
0035279C  neg         eax 
0035279E  mov         byte ptr [ebp-25h],al

На выражение первого типа компилятор дает варнинг, что мол повлияет на производительность. Так ли он прав?

Оффлайн inkblack

  • Старожил
  • *
  • Сообщений: 1216
    • Просмотр профиля
Re: Что быстрее?
« Ответ #1 : 11 Августа 2012, 19:13:02 »
Если вся ваша программа состоит из одних только выражений типа
Код: (с) [Выделить]
bool b1 = strchr(cc, 'a');то может и повлиять  ;D

Вопрос в том, что получается при разных оптимизациях.

А на предупреждение о том, что «повлияет на производительность», думаю, не стоит обращать внимание, скорее всего, это неправильное диагностическое сообщение.

Кстати, как точно выглядит замечание?
Делюсь знаниями, но их у меня мало!

Оффлайн [DarkNet]Alpha

  • Автор темы
  • Активист
  • *
  • Сообщений: 987
  • Эмоциональный эльдар
    • Просмотр профиля
    • EBM-радио
Re: Что быстрее?
« Ответ #2 : 11 Августа 2012, 20:51:17 »
warning C4800: 'char *' : forcing value to bool 'true' or 'false' (performance warning)

Оффлайн mkarasik

  • Участник
  • *
  • Сообщений: 163
    • Просмотр профиля
Re: Что быстрее?
« Ответ #3 : 11 Августа 2012, 23:59:18 »
http://msdn.microsoft.com/en-us/library/b6801kcy%28v=vs.71%29.aspx

Никакой связи со скоростью исполнения нет. Просто предупреждение. bool  это 1 или 0. Т.е. если всегда сравнивать с нулем типа if (b1 == false) и т.д. то можно забить на это предуреждение. В данном случае вся вина на кодере если накосячил. Ну а в твоем случае количество операций получилось такое же, хочешь знать точнее лезь в книжку по ассемблеру и смотри количество клоков.

Правильно писать bool b2 = (strchr(cc, 'a') != 0); не думаю, что теоя программа супер пупер real time, что надо заморачиваться сравнением операций ассемблера. Один клок можно и на cache miss схавать.

 

Страница сгенерирована за 0.015 секунд. Запросов: 22.