Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Сбросьте ссылочку пожалуйста
Не сохранил. На форуме упоминал здесь. Сам искал через поисковики.
Не сохранил. На форуме упоминал здесь. Сам искал через поисковики.
Очевидно же, что все эти велосипеды много раз были когда-то пересобраны. Даже книжки выходили, вплоть до asm-реализаций.
Сейчас основы сложно найти, т.к. почти все используют соответствующие API на все случаи жизни.
Поэтому нужно просто регистрироваться на форумах и спрашивать.
Очевидно же, что все эти велосипеды много раз были когда-то пересобраны. Даже книжки выходили, вплоть до asm-реализаций.
Сейчас основы сложно найти, т.к. почти все используют соответствующие API на все случаи жизни.
Поэтому нужно просто регистрироваться на форумах и спрашивать.
А почему не пользуетесь LONG_MAX/MIN ? Будет как-то приличней смотреться. Вроде, ничего выглядит. Я прогал ваши тесты на gcc (c мин модификацией, естественно, компилятор очень старый 5.4.0, что было под рукой):
Ну да, не красиво. Но LONG_MAX = 9223372036854775807 больше, чем 9007199254740992. А на шестнадцатеричный вид этого числа - 0x20000000000000 ругается, т.к. он видимо только для типа ulong. Даже не знаю как сделать красивее. Не писать же (ulong)(1<<53), т.к. это уже операция, требующая времени.
Тип double начинает содержать в себе целые числа без дробной части не со значения LONG_MAX, а с максимальной возможной мантиссы. А на мантиссу отведено 53 бита, т.е. 2^53=9007199254740992.
У вас в коде подсчёт времени барахлит - вывод в милисекундах (а не нано), и я так и не понял - зачем нужно минус t0.
t0 - это время полного цикла из 1000000 проходов суммы простых double
а t - время такого же цикла суммы тех же значений double, но пропущенных через функции ceil, Ceil, round и т.д.
Я исходил из логики, что разница (t-t0) и есть чистое время, затраченное именно на эти функции.
Конечно же, большей объективности можно добиться только сделав несколько замеров.
- в нано я высчитываю исходя из времени выполнения одной функции из 1 000 000. Именно в нано правильно.
pavlick_:
Я прогал ваши тесты на gcc (c мин модификацией, естественно, компилятор очень старый 5.4.0, что было под рукой):
1. Компиляция с -O3
2. Компиляция с -Ofast
Не писать же (ulong)(1<<53), т.к. это уже операция, требующая времени.
Эта операция не требует времени, как все операции с константами, включая строки.
Эта операция не требует времени, как все операции с константами, включая строки.
Ух ты - прикольно! Спасибо. А я думал - каждый раз считает. Ну да логично, можно и на этапе компиляции уже посчитать.
Тогда так:
Правда было бы правильнее вместо 53 писать DBL_MANT_DIG
Случай минимального выигрыша, если все значения double дробные.
Это что-ж получается. Что откомпилированный MQL5 код работает быстрее чем даже Ofast? С трудом верится. Наверное там у Вас был 32 битный компилятор.
Я минус t0 отовсюду выкинул (подумал, что какая-то ошибка) и у меня в выводе замер всего цикла, а не одного прохода. Если привести к вашей форме вывода в наносекундах на итерацию (в первой строке "Время цикла без округления" - способ подсчёта у нас совпадает), то получим:
На gcc особого ускорения нет (а на -Ofast даже медленней). На мкл значительное судя по вашему тесту, но:
у вас 985'651 из 1'000'000 т.е. почти все итерации удовлетворяют условию x < MIN || x > MAX.
-Ofast отключает всякие проверки на inf/nan, установку errno, т.е остаётся голое округление на fpu. И это голое округление не удаётся победить простейшим сравнением x < MIN || x > MAX.
На gcc особого ускорения нет (а на -Ofast даже медленней). На мкл значительное
Хотя как сказать. Для красивых цифр выкинули t0 и получили разнцицу в 20 раз. Даже минимальный дополнительный код в виде цикла (+t0) делает красивый результат в несколько десятков раз в менее привлекательный в районе двух раз. А чего говорить, если это не голый цикл, а реальный алгоритм делающий что-то полезное? Да разница вовсе будет не видна, будет болтаться где-то далеко после запятой и врядли станет узким местом. В реальном приложении взятие мьютекса, цпу барьеры, выделение памяти - гораздо более затратно, чем округление. В общем, имхо, не стоит игра свеч.
Да разница вовсе будет не видна, будет болтаться где-то далеко после запятой и врядли станет узким местом. В реальном приложении взятие мьютекса, цпу барьеры, выделение памяти - гораздо более затратно, чем округление. В общем, имхо, не стоит игра свеч.
Это верно в 99% случаев, да.
Прежде, чем оптимизировать, стоит побеспокоиться, чтоб было, что оптимизировать.
На своей практике помню только один случай, когда реально помогла собственная реализация atof. Хотя казалось бы.
И стоит помнить о том, что любая оптимизация (кроме оптимизации ***) отнюдь не бесплатна.