четверг, 21 февраля 2008 г.

А вот за что я не люблю пропагандистов ФП

Так это за некорректные сравнения.

Статья Making Haskell faster than C!

В статье приводится пример оптимизации кода на Haskell таким образом что его выполнение происходит быстрее чем выполнение кода написанного на С. Это было бы приятно и интересно...если бы исходный код на С и на Haskell был бы хоть примерно эквивалентен.

Задача простая - подсчет количества слов в файле. Слова - это части текста отделенные пробелами/табуляцией/переносом строк.

Вот исходный код на С:

int main() {

    int i = 0;

    int c, last_space = 1, this_space;

    while ((c = getchar()) != EOF) {

        this_space = isspace(c);

        if (last_space && !this_space)

            i++;

        last_space = this_space;

    }

    printf("%i\n", i);

    return 0;

}



Вот исходный код на Haskell:

main = print . length . words =<< getContents

С момощью оптимизатора автор добивается того чтобы код на Haskell выполнялся быстрее кода на С. Потрясающий результат, если бы не одно "но".

Программа на С сделана явно с одной целью - написать ее самым медленным способом. Как добиться того чтобы программа выполнялась максимально медленно? Найти самую медленную опрацию и испльзовать ее максимально часто. В данном случае самая медленная операция это чтение из файла/потока. Как использовать ее максимально часто? Читать посимвольно...

Это ясно и понятно большенству программистов на С\С++. Т.е. программисты на С\С++ видят что автор сделал совершенно некорректное сравнение. Сознательно сделав код на С максимально медленным. Автор жулик.... и неважно сделал он это сознательно или нет.

В результате вместо того чтобы заинтересовать программистов на С\С++ возможностями Haskell в частности и ФП в целом мы получаем отторжение.

Комментариев нет: