C++ Exp по сравнению с Журналом: Который быстрее?

if connectionError != nil {
        fmt.Println(connectionError)
        return 
    }
defer connection.Close()

отложить соединение. Функция Close () должна быть после проверки ошибок, так как переменная соединения может быть ноль, если набор номера возвращается с некоторой ошибкой.

11
задан Kyle Simek 3 May 2009 в 16:59
поделиться

8 ответов

AFAIK алгоритмы, сложность та же, разница должна быть только (надеюсь, незначительной) константой. В связи с этим я бы использовал exp (a)> b просто потому, что он не ломается при неверном вводе.

23
ответ дан 3 December 2019 в 01:02
поделиться

некоторые быстрые тесты в 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
3
ответ дан 3 December 2019 в 01:02
поделиться

Редактировать: Изменен код, чтобы избежать переполнения 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 делает это так. Но это не кажется совершенно невероятным.

8
ответ дан 3 December 2019 в 01:02
поделиться

Вам действительно нужно знать? Это займет большую часть вашего рабочего времени? Откуда вы знаете?

Хуже, это может зависеть от платформы. Тогда что?

Так что, проверяйте это, если вам не все равно, но тратить много времени на агонизацию микрооптимизации, как правило, плохая идея.

7
ответ дан 3 December 2019 в 01:02
поделиться

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.

1
ответ дан 3 December 2019 в 01:02
поделиться

если вы уверены, что это горячая точка - ваши компиляторы являются вашими друзьями. Хотя это зависит от платформы (если вы стремитесь к производительности в подобных местах - вы не можете быть независимым от платформы) Так. Вопрос на самом деле в том, какая инструкция asm на вашей целевой архитектуре, и в циклах задержки +. Без этого это просто спекуляция.

0
ответ дан 3 December 2019 в 01:02
поделиться

Поскольку вы работаете со значениями << 1, обратите внимание, что x-1> log (x) для x <1, это означает, что x-1

5
ответ дан 3 December 2019 в 01:02
поделиться

Было бы разумно, чтобы журнал был быстрее ... Exp должен выполнить несколько умножений, чтобы получить свой ответ, тогда как log должен только преобразовать мантиссу и экспоненту в основание-е из базы-2 .

Просто не забудьте проверить границы (как говорили многие другие), если вы используете журнал.

1
ответ дан 3 December 2019 в 01:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: