if connectionError != nil {
fmt.Println(connectionError)
return
}
defer connection.Close()
отложить соединение. Функция Close () должна быть после проверки ошибок, так как переменная соединения может быть ноль, если набор номера возвращается с некоторой ошибкой.
AFAIK алгоритмы, сложность та же, разница должна быть только (надеюсь, незначительной) константой.
В связи с этим я бы использовал exp (a)> b
просто потому, что он не ломается при неверном вводе.
некоторые быстрые тесты в python (который использует c для математики):
$ time python -c "from math import log, exp;[exp(100) for i in xrange(1000000)]"
real 0m0.590s
user 0m0.520s
sys 0m0.042s
$ time python -c "from math import log, exp;[log(100) for i in xrange(1000000)]"
real 0m0.685s
user 0m0.558s
sys 0m0.044s
будет указывать, что log немного медленнее
Редактировать: функции C оптимизируются компилятором, кажется, поэтому цикл - это то, что занимает время
Интересно, что в Си они кажутся одинаковыми (возможно, по причинам, указанным Марком в комментарии)
#include <math.h>
void runExp(int n) {
int i;
for (i=0; i<n; i++) {
exp(100);
}
}
void runLog(int n) {
int i;
for (i=0; i<n; i++) {
log(100);
}
}
int main(int argc, char **argv) {
if (argc <= 1) {
return 0;
}
if (argv[1][0] == 'e') {
runExp(1000000000);
} else if (argv[1][0] == 'l') {
runLog(1000000000);
}
return 0;
}
, давая время:
$ time ./exp l
real 0m2.987s
user 0m2.940s
sys 0m0.015s
$ time ./exp e
real 0m2.988s
user 0m2.942s
sys 0m0.012s
Редактировать: Изменен код, чтобы избежать переполнения exp (). Это привело к значительному сокращению поля между двумя функциями. Спасибо, fredrikj.
Код:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc, char **argv)
{
if (argc != 3) {
return 0;
}
int type = atoi(argv[1]);
int count = atoi(argv[2]);
double (*func)(double) = type == 1 ? exp : log;
int i;
for (i = 0; i < count; i++) {
func(i%100);
}
return 0;
}
(скомпилировать с использованием:)
emil@lanfear /home/emil/dev $ gcc -o test_log test_log.c -lm
Результаты кажутся довольно убедительными:
emil@lanfear /home/emil/dev $ time ./test_log 0 10000000
real 0m2.307s
user 0m2.040s
sys 0m0.000s
emil@lanfear /home/emil/dev $ time ./test_log 1 10000000
real 0m2.639s
user 0m2.632s
sys 0m0.004s
Немного удивительно, что журнал кажется более быстрым.
Чистое предположение:
Возможно лежащий в основе математический ряд Тейлора сходится быстрее для логарифма или что-то еще? На самом деле мне кажется, что натуральный логарифм легче вычислить, чем экспоненциальную функцию :
ln(1+x) = x - x^2/2 + x^3/3 ...
e^x = 1 + x + x^2/2! + x^3/3! + x^4/4! ...
Однако не уверен, что функция библиотеки c делает это так. Но это не кажется совершенно невероятным.
Вам действительно нужно знать? Это займет большую часть вашего рабочего времени? Откуда вы знаете?
Хуже, это может зависеть от платформы. Тогда что?
Так что, проверяйте это, если вам не все равно, но тратить много времени на агонизацию микрооптимизации, как правило, плохая идея.
It can depend on your libm, platform and processor. You're best off writing some code that calls exp
/log
a large number of times, and using time
to call it a few times to see if there's a noticeable difference.
Both take basically the same time on my computer (Windows), so I'd use exp
, since it's defined for all values (assuming you check for ERANGE
). But if it's more natural to use log
, you should use that instead of trying to optimise without good reason.
если вы уверены, что это горячая точка - ваши компиляторы являются вашими друзьями. Хотя это зависит от платформы (если вы стремитесь к производительности в подобных местах - вы не можете быть независимым от платформы) Так. Вопрос на самом деле в том, какая инструкция asm на вашей целевой архитектуре, и в циклах задержки +. Без этого это просто спекуляция.
Поскольку вы работаете со значениями << 1, обратите внимание, что x-1> log (x) для x <1,
это означает, что x-1
Было бы разумно, чтобы журнал был быстрее ... Exp должен выполнить несколько умножений, чтобы получить свой ответ, тогда как log должен только преобразовать мантиссу и экспоненту в основание-е из базы-2 .
Просто не забудьте проверить границы (как говорили многие другие), если вы используете журнал.