Comments 37
Как можно видеть, Java единовременно использует минимум 4 ядра, в то время как программа на C++ — одно.
Стесняюсь спросить, с каких это пор за использование ядер отвечает язык, а не программист? Ну и кто вообще в наше время обучает нейросети на процессоре?
С тех пор как гошечка вышла)
Гошечка может упрощать, но работа все равно за программистом
Да как бы и там надо писать код, go и так далее, да ещё и за памятью следить.
В общем это так не работает.
Во-первых, пожалуйста, опубликуйте код на всех языках и со всеми параметрами запуска.
Во-вторых — если алгоритм одинаковый, почему где-то он использует несколько ядер, а где-то — одно?
В-третьих, опять же, если алгоритм одинаковый, чем объясняется
вывод после обучающего сета программы написанной на С++ был другим, что повлекло за собой изменение количества эпох которое ей потребовалось для должного обучения? Может, в коде C++ просто-напросто баг?
C C++ вообще трэш и угар. Везде используется несколько потоков, а на C++ — один, т.е. вообще разная структура программ — что вообще сравнивает автор? И загрузка сети (соотношение принято/отправлено) на C++ не соответствует таковой на Java — т.е. там не просто структура программы разная, но и алгоритмы разные, и, как говорит сам автор, результаты (штоа?!!!)
И у вас серьёзные ошибки в программах на Java и C++. Это по видно по совершенно ненормальным графикам процессора и сети (сети ?!). Они не могут так выглядеть на этой задаче.
Ну, и кроме того, у вас все программы используют разные подходы.
Такой громкий заголовок, интересная тема, и, уж простите, такое низкое качество по факту.
А вот это:
Неожиданно медленными оказались результаты работы программы написанной на C++. Отчасти это можно объяснить большим количеством эпох которое ей потребовалось для нахождения правильного ответа.
вообще не понятно, как комментировать. Вы точно понимаете, о чём написали?
Дак для нормальных задач сейчас нейросети на гпу обучаются, там быстродействие языка уже неважно должно быть.
Неожиданно медленными оказались результаты работы программы написанной на C++. Отчасти это можно объяснить большим количеством эпох которое ей потребовалось для нахождения правильного ответа.
А вода не стекает с плоской земли, отчасти из за бортиков по краям :)))
Спасибо! Вы сделали мой день более веселым.
Я еще затра сюда загляну, посмотрю в камменты.
JavaScript бы ещё сюда
gitlab.com/di.romanov/neuron1cpp.git
Kotlin, остальное выложу ближе к вечеру
Заменив «string» на «const string &» время работы уменьшилось с 13 до 10 секунд.
Повсеместно передаются std::vector по значению, это тоже сильно влияет на производительность. По быстрому сделал возврат константной ссылки на статический вектор из тела функции (при каждом вызове делаю clear), теперь отрабатывает за 1 секунду.
За 10 минут ускорил программу в 13 раз! Распаралелить не получилось, надо дольше думать и без статических векторов код писать (передавать через аргумент по ссылке).
Для std::string можно сравнивать через ==, без strcmp. Это не влияет на производительность, просто их можно сравнивать напрямую.
В 5 раз ускоряет включение оптимизации, в 2 раза больше эпох, и твоя замена еще в 13 раз.
5*2*13
Но, честно говоря, без распараллеливания всерьез говорить не о чем.
Мы же не хотим измерять, как работает strcmp и менеджер памяти.
Так как вектора используются просто для выборки — переделал на for по коллекции с нужным условием.
С фиксом для количества эпох время обучения сократилось со 102 до 1 секунды.
Для сравнения — kotlin на этой же машине выдаёт 7 секунд.
Было бы интересно увидеть C# в этом сравнении
даже на одной выборке, на одном ПК, под одной ОС сеть может найти решение, а может и не найти...
Это как? Там случайные числа используются или таймстампы?
Меня признаться наоборот смущает, что результаты работы программы на СПП отличаются от результатов работы программы на той же яве.
gcc 5.2 win32
C++ -O2 45c
C++ 212c
2 400 000 итераций
pyton 2.7.8 -O 223с
1 200 000 итераций o_O
Самое интересное, что CPU при этом не занят. 4 ядра по 20% и для Питона и для С++
Причем программы однопоточные.
В общем отличный тест, рановато еще автору писать на Хабре =)
Приятно, когда берёшь исходник и он компилируется и работает.
К тому же вышло неплохое сравнение именно реализации на разных языках программирования.
Конечно качество кода хромает и сложно говорить о сравнении производительности между языками — всё-таки для одних языков используются ссылочные типы, а для с++ доступ по индексу.
Я так понимаю, что если алгоритм одинаковый и входные данные одинаковые, то количество эпох, как и конечный результат должны быть одинаковыми и тогда только имеет смысл сравнивать время, затраченное на получение результата.
В этой же статье сравнивается радиус кривизны рук программистов, которые переписывали алгоритм на разные языки, не более того. Java, Kotlin вообще не понятно зачем сравнивать. И там и там на выходе должен быть ± одинаковый байткод. Не скажу автору спасибо за потраченное время, и.к. потрачено оно впустую.
Сравнение скорости работы языков программирования на примере решения задачи обучения нейронной сети