А это должен делать код пользователся. Иначе проверки на NULL будут почти везде и половина перфоманса будет тратиться именно на них.
W>Вот и я думаю если так всегда за производительностью гонятся — но проверки все таки включать надо, хотя бы на NULL.
Здравствуйте, Andrew S, Вы писали:
AS>А это должен делать код пользователся. Иначе проверки на NULL будут почти везде и половина перфоманса будет тратиться именно на них.
Вот поэтому — сейчас и такие "тормознутые" системы
Здравствуйте, Andrew S, Вы писали:
AS>А это должен делать код пользователся. Иначе проверки на NULL будут почти везде и половина перфоманса будет тратиться именно на них.
W>>Вот и я думаю если так всегда за производительностью гонятся — но проверки все таки включать надо, хотя бы на NULL.
тогда надо assert'ом проверять. Он выполняется только в debug-версии.
Здравствуйте, ZakkeR, Вы писали:
ZR>А регистер тут вообще не причем. Это я его поставил чтоб было
ZR>На самом деле мой код быстрее, потому как содержит только один условный переход. Скомпили со всеми оптимизациями оба кода и сравни.
Скомпилировал твой вариант и свой со всеми оптимизациями по скорости в VC++ 7. Твой проиграл целый байт :
__inline int strlen1(const char *s)
{
register int l = -1; do {l++;} while (*(s+l)); return l;
}
__inline size_t strlen2(const char* s)
{
size_t n = 0;
while (*s++) ++n;
return n;
}
int _tmain(int argc, _TCHAR* argv[])
{
const char* s = "Test";
size_t s1 = strlen1(s);
size_t s2 = strlen2(s);
bool b = s1 == s2; // это чтоб s1 и s2 не соптимизировались в ничто :)))
std::cout << b << "\n";
return 0;
}
Здравствуйте, MaximE, Вы писали:
ME>Здравствуйте, ZakkeR, Вы писали:
ZR>>А регистер тут вообще не причем. Это я его поставил чтоб было
ZR>>На самом деле мой код быстрее, потому как содержит только один условный переход. Скомпили со всеми оптимизациями оба кода и сравни.
ME>Скомпилировал твой вариант и свой со всеми оптимизациями по скорости в VC++ 7. Твой проиграл целый байт :
видно что твоя и моя функция отличаются только начальным значением смещения. У меня -1, у тебя 0
Кстати, что есть адрес 4247A1h ? По моему это адрес 2-го байта строки. Т.е. Твоя функция в данном конкретном случае была жутко соптимизирована (снимаю шляпу перед VC7). Поскольку VC7 знает, что в данном случае ему подсовывают КОНСТАНТНУЮ строку, и эта строка не пустая, то данный код работает верно. Но! Если подставить пустую строку, копилятор VC7 подозреваю, вообще цикл выкинет.
Попробуй сделать строку не константной, да так чтобы компилятор в это поверил и смотри что получится.
А в VC6 твоя функция компилируется значительно хуже моей.
[]
ZR>Попробуй сделать строку не константной, да так чтобы компилятор в это поверил и смотри что получится.
ZR>А в VC6 твоя функция компилируется значительно хуже моей.