Автор
|
Тема: BOOL круче bool?
|
ADK |
опубликован 21-01-2002 13:26 MSK
Где-то читал, что встроенный тип bool лучше не юзать, если нужна скорость. Якобы 32-x битный BOOL обрабатывается быстрее, так как влазит как раз в регистр. Это правда?
|
migel
|
опубликован 21-01-2002 14:53 MSK
Правда |
SUnteXx
|
опубликован 21-01-2002 15:32 MSK
И какова разница между ними (в плане скорости)? |
ADK
|
опубликован 22-01-2002 05:20 MSK
? |
migel
|
опубликован 22-01-2002 00:31 MSK
[BOOL] call .... test EAX, EAX jnz....[bool] call and eax, 0xFF ;<< test al, al jnz
|
Valery
|
опубликован 22-01-2002 14:59 MSK
migel, я не сильный знаток асма, но мне кажется что и без and eax, 0xFF с bool'ом должно работать, если конечно результат возвращается только в AL. Так нафига туда компиллятор and тыкает? Или я неправ? |
migel
|
опубликован 22-01-2002 16:13 MSK
Он просто проверяет 1 байт (согласно стандарту) поэтому и эти АНД раскидываются так как процедура возвращает в EAX не все а только часть его (AL) в остальной части двойного слова может быть все что угодно. |
Kosha
|
опубликован 22-01-2002 17:05 MSK
Не понял... В инклюдах явно прописано: typedef int BOOL; //;-))) Дык чо спорить-то? |
Kosha
|
опубликован 22-01-2002 17:06 MSK
2migel: И еще я не совсем понял, к чему этот асмовый код относится? %-{ }
|
Student
|
опубликован 22-01-2002 17:39 MSK
Товарищи ! Надо смотреть документацию по Intel. Там-же ЯСНО написано, что если после команды с использованием 32-битного регистра следующая команда использует часть этого-же регистра то образуется пауза в 8 тактов. Вот эта пауза и является главной задержкой при работе с bool.>> [BOOL] call .... test EAX, EAX ; >> паузы нет jnz.... [bool] call ... and eax, 0xFF ;<< test al, al ; >> ПАУЗА 8 ТАКТОВ jnz ...
|
rivitna
|
опубликован 22-01-2002 21:57 MSK
2 Student: Приятно послушать специалиста! Насчет восьми тактов это сильно. :))) Про появление дополнительных тактов при определенной адресации, при невыровненном коде и данных и т.д. и т.п. я знаю. Но это нечто новенькое. Наверное, читал фальшивку, написанную конкурентами Intel.Суть кода, написанного Migel'ем дожна быть ясна и ребенку [BOOL] call .... test EAX, EAX jnz.... [bool] call and eax, 0xFF ;<< test al, al jnz Без всяких высоких материй на интуитивном уровне должно быть ясно, что одна команда test EAX, EAX проще и эффективнее, чем две and eax, 0xFF test al, al Тем более, что в первом случае это 2 байта кода, а во втором 7. Арифметика предельно ясна! |
Vovochka
|
опубликован 23-01-2002 00:04 MSK
Позвольте и мне встрять в это обсуждение. 32 разрядная BOOL, и байтовая bool. Что быстрее. Вы как-то увлеклись асмом. "Без всяких высоких материй на интуитивном уровне должно быть ясно, что одна команда test EAX, EAX проще и эффективнее, чем две and eax, 0xFF test al, alТем более, что в первом случае это 2 байта кода, а во втором 7. Арифметика предельно ясна!"-конец цитаты 7-то никак не выходит. И нельзя ли привести и количество тактов на выполнения каждой команды. Потери по времени скорее всего минимальны, а выигрыш в памяти 3 байта. Но я не об этом. Обычно булевы флаги передаются в функции как управляющие, а в этом случае, загрука и выгрузка из стека съедят выигрыш по скорости..., если не предпринималь каки-то специальных действий, что обычно не делается. Тк что, в целом, выходит: хрен редьки не слаще...
|
rivitna
|
опубликован 23-01-2002 00:32 MSK
2 Vovochka: Не смеши мои коленки!Вчера милиция разогнала демонстрацию коммунистов до 75 км/ч, а ты, родной, все тормозишь. В тактах могу привести только для i486 и то приблизительно Привожу в машинных кодах, считай: test eax,eax 85 С0 and eax,0FFh A9 FF 00 00 00 00 test al,al 84 C0 Насчет стека комментировать вообще не хочется комментировать. Специалист ты, круче навозной кучи. Процессор оптимизирован на работу с базовыми регистрами. В данном случае это 32-разрядные регистры. И по хрену, операции ли со стеком и другие. Если в стек загонять непосредственные значения, то это другой вопрос.
|
migel
|
опубликован 23-01-2002 13:45 MSK
дааа уж развели демагогию насчет стека так там тоже and применяется вовсю - так как запихивается в стэк не байт а двойное слово то и работа со стэковыми переменными такая же:mov eax, [esp+bFlag] and eax, 0FFh test al, al |
rivitna
|
опубликован 23-01-2002 13:57 MSK
Вот конкретный чувак! Без лишней демагогии правду в матку впендюрил!А ведь правду глаголит! Но это частности. А насчет директив асма, родные и не в меру непонятливые мои. Задачей компилятора и является получить эффективный код в машинных кодах, то бишь ассемблер. С другой стороны, MS - не дураки, ради красивой жизни BOOL не введут. |
Student
|
опубликован 23-01-2002 15:50 MSK
2rivitna: Надо сказать, что эта пауза есть. Особенно она чувствительна на 386 и 486. Можешь даже проверить. Пишем:_asm { ... xor eax,eax test eax,eax ... } а также: _asm { ... xor eax,eax test al,al ... } Если второй пример работает также быстро как и первый, то я я тебе ставлю пол-литра... |
rivitna
|
опубликован 23-01-2002 16:33 MSK
2 Student: Неужели на глаз заметно? :) Сколько ни писал на асме под DOS и Win32 не замечал такого феномена.Ты пойми, с памятью еще может быть лишний такт при хитрой адресации, при операциях со стеком, если они следуют друг за другом, но никак с регистрами. По документации для i486 эти команды требуют по такту вне зависимости от взаимного расположения команд и других условий. Проверить это весьма сложно, потому что нужны чистые условия эксперимента, я честно не возьмусь это сделать. Да ж за поллитры! PS: спор в принципе-то глупый, потому как это капля в море неэффективного кода, выдаваемого по объективным причинам компилятором. |
Student
|
опубликован 23-01-2002 19:21 MSK
2rivitna: Ок, мир и дружба. Я просто протестировал эти кусочки кода в цикле (>100 000 000 проходов) с "секундомером" (GetTickCount()) и оказалось что на AMD XP 1800+ второй пример чуть тормозит, но не так уж и сильно, чтобы терять товарищей по конфе :) |
rivitna
|
опубликован 23-01-2002 19:58 MSK
2 Student: Мир! Разделим поллитры на двоих. Я тоже дорожу хорошими отношениями :))) |
Valery
|
опубликован 23-01-2002 23:21 MSK
а вот вам хохма, камешек в огород BOOL:BOOL func1 (int choice) { return (choice == 1)? 1000 : 0; } bool func2 (int choice) { return (choice == 1)? 1000 : 0; } int main(int argc, char *argv[]) { cout << (FALSE == func1(1)) << endl; cout << (FALSE == func1(2)) << endl; cout << (TRUE == func1(1)) << endl; // surprise!!! cout << (TRUE == func1(2)) << endl; cout << (false == func2(1)) << endl; cout << (false == func2(2)) << endl; cout << (true == func2(1)) << endl; cout << (true == func2(2)) << endl; } прекрасно понимаю, что пример надуман, обычно никто не сравнивает булевы переменные с константами, но факт, что стандартный bool при этом работает правильно. а сколько новичков может наступить на эти грабли? ;) думаю, такая мина не стоит пары сэкономленных тактов. все вышесказанное мое имхо.
|
rivitna
|
опубликован 24-01-2002 07:23 MSK
2 Valery: Есть у меня один знакомый чайник, который решил изучить команды ДОС, он их вводил на компьютере, так скать тренировался. В один прекрасный день он дошел до "FORMAT", на примере в книжке "format c:" его ждало разочарование... Мне стало обидно за беднягу, все спасли, конечно, но теперь он идейный борец против команды "format"...Кстати, в MSDN к некоторым функциям API добавлено замечание: что возвращаемое значение TRUE не всегда 1. Что теперь делать, чтобы спасти новичков, ума не приложу. Может напишем, Valery, консолидированную просьбу в MS? |
Valery
|
опубликован 24-01-2002 08:09 MSK
2rivitna: меня можешь не причислять к новичкам. бороться против BOOL я не собираюсь. но уж если ms не всегда хотят возвращать 1/0 то могли бы и не называть тип логическим, нормальные программисты точно так же спокойно бы относились к возвращаемому инту, зная что он спокойно проверяется в логических выражениях. на меня наезды Ваши, сэр, безпочвенны. |
migel
|
опубликован 24-01-2002 10:52 MSK
"Всемирное братание, как всегда, закончилось наездом..." Топик, пожалуй, закрывать можно. а то передеретсь еще... :-) |
rivitna
|
опубликован 24-01-2002 11:05 MSK
2 Valery: Обидели мышку, нагадили в норку! :))) Извини, что задел твою ранимую душу. Поверь, не хотел.По поводу примера: Приятно общаться с людьми, которые всегда могут довести до абсурда, пускай гипотетического. Бывают ситуации, когда кажется, что совсем х...о, но твой яркий пример показал, что может быть и хуже, и на душе от этого легче становится. :) Не восприми, как наезд. Не обижайся за отсутствие пиетета перед докой. :) С уважением! PS: Объявляю мараторий на участие в этом топике. Можете мне гадости писать, я щеку в другом топике подставлю :) |
Valery
|
опубликован 24-01-2002 11:38 MSK
да ладно, мне тоже пофигу.... прошу только заметить, что первоначально я не наезжал ни на кого адресно. |
Valery
|
опубликован 24-01-2002 11:48 MSK
2migel: совсем не в продолжение флейма, а очень даже по теме. мне так кажется, что меньшее быстродействие bool может быть обосновано еще и тем, что (как я уже показал на гипотетическом примере) такое поведение должно что-то кушать еще и в самой функции, которая возвращает значение, т.е. когда мы говорим return 1000; происходит преобразование к 1 (true). хоть пара команд да и должна быть для этого. так что факторов большего быстродействия будет уже 2 по крайней мере. А уж пользоваться тем или другим дело личных предпочтений. |
SUnteXx
|
опубликован 25-01-2002 00:30 MSK
Вот еще пример:BOOL b = (BOOL)SendMessage(hWnd, WM_GETTEXTLENGTH, 0l, 0l); // У меня возвратилось 80 bool b1 = (bool)SendMessage(hWnd, WM_GETTEXTLENGTH, 0l, 0l); // А здесь 1! |