24 lipca 2016

Sprintf a wydajność

Podczas doświadczeń z własną implementacją funkcji kryptograficznej MD5 natrafiłem na problem związany z wydajnością. Zobaczcie sami…

Wydajność funkcji sprintf

W poniższym przykładzie mamy dwa przykładowe listingi. Oba dokonują obliczenia 5 milionów razy skrótu kryptograficznego pewnego łańcucha tekstowego. Pierwszy z nich oblicza skrót ciągle tego samego łańcucha tekstowego, drugi formatuje tekst przy wykorzystaniu funkcji sprintf. Jak myślicie, jak bardzo wariant drugi będzie wolniejszy?

int main() {
    md5_computer md5Computer;
    constexpr uint32_t ILOSC = 5000000;
    string t1 = "JAKIS TEKST.......................";

    chrono::steady_clock::time_point begin = chrono::steady_clock::now();
    int text_len = t1.size();
    for (uint32_t i = 0; i < ILOSC; ++i)
    {
        const uint8_t *digest = md5Computer.hash_it(t1.c_str(), text_len);
    }


    auto delta_time = chrono::steady_clock::now() - begin;
    double delta_time_ms = chrono::duration_cast<chrono::milliseconds>(delta_time).count();
    double hash_per_sec = ILOSC / delta_time_ms * 1000.0;
    cout << "hashs per sec = " << hash_per_sec / 1000000.0;
    cout << " M  time: " << delta_time_ms << " ms" << endl;
    return 0;
}
int main() {
    md5_computer md5Computer;
    constexpr uint32_t ILOSC = 5000000;
    string t1 = "JAKIS TEKST.......................";

    chrono::steady_clock::time_point begin = chrono::steady_clock::now();
    int text_len = t1.size();
    char buf[100];
    for (uint32_t i = 0; i < ILOSC; ++i)
    {
        sprintf( buf,"JAKIS TEKST.....[%d]..........", i );
        const uint8_t *digest = md5Computer.hash_it(buf, 30);
    }


    auto delta_time = chrono::steady_clock::now() - begin;
    double delta_time_ms = chrono::duration_cast<chrono::milliseconds>(delta_time).count();
    double hash_per_sec = ILOSC / delta_time_ms * 1000.0;
    cout << "hashs per sec = " << hash_per_sec / 1000000.0;
    cout << " M  time: " << delta_time_ms << " ms" << endl;
    return 0;
}
Jednostka Bez sprintf Z sprintf
Szybkość [] 8 0.47
Czas wykonania [s] 0.62 10.6