![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
Neox_GeForce |
|
||||||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 283 Регистрация: 14.11.2007 Где: Украина Репутация: нет Всего: нет |
код на шарпе
Результаты(3 запуска): 1071 ms 1068 ms 1068 ms Потом скомпилил в среде Dev-C++ с найлутшей оптимизацией
Результаты: 5620 ms 5620 ms 5460 ms Машина: Intel core 2 duo 1.86 . RAM 1GB. -------------------- ![]() Челябинские программисты настолько суровы, что обходятся без компиляторов. Челябинские программисты настолько суровы, что считают ассемблер недопустительной роскошью - они вручную магнетизируют участки жесткого диска. |
||||||||||||
|
|||||||||||||
kamre |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 330 Регистрация: 24.3.2006 Репутация: 1 Всего: 13 |
Для начала неплохо перемерять с корректным подсчетом времени:
И использовать современный компилятор (MSVC9/IntelCPP11/GCC4), а не престарелый MinGW из Dev-C++. |
||||||
|
|||||||
LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
1. Этот тест меряет в первую очередь затраты на вызов метода. И в том что C# в это тесте быстрее C++ нет ничего удивительного.
2. Этот топик все таки посвящен Java, а не C# vs C++, так что не увлекайтесь. ![]() -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
serger |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 19.6.2007 Где: Ижевск Репутация: 1 Всего: 5 |
Ну ОЧЕНЬ давно хотел упомянуть про аллокацию в java.
Руки таки дошли... Теория и практика Java: Еще раз о городских легендах о производительности -------------------- упс! |
|||
|
||||
Vitaly333 |
|
||||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 6.11.2006 Где: Volgograd Репутация: 2 Всего: 2 |
Вот и я решил внести свою лепту... Сегодня будем сравнивать какой же язык/компилятор лучше всего оптимизирует циклы и быстрее производит арифметические операции над числами с плавающей точкой или запятой, кому как угодно. Как гласит золотое правило 80% времени выполнения программы уходит на 20% кода. Чаще всего как раз эти 20% состоят из большого кол-ва вложенных циклов и арифметических вычислений. От того как оптимизирован "циклический" алгоритм зависит многое. Но сегодня, в большинстве случаев, за оптимизацию циклов отвечает не программист а компилятор.От того как последний выполнит эту работу также зависит очень многое. Одни компиляторы очень хорошо справляются с этой задачей, другие намного хуже. Основной вопрос заключается в следующем: стоит ли оптимизировать циклы вручную, если современные компиляторы могут сделать это за вас? И какой копилятор на сегодня лучше всего делает это? Я попытаюсь ответить на эти вопросы в этой теме.
Для сравнений я взял, на мой взгляд, самый подходящий в этом случае численный алгоритм - алгоритм умножения матриц (С = С + A*B). Во первых он довольно прост в реализации. Во вторых это фундаментальный алгоритм линейной алгебры, который реально способен показать производительность программно-аппаратной системы, её приемущества и недостатки. В третьих, существует различные варианты его программной реализации, а значит есть несколько возможных путей его оптимизации для компиляторов и программистов. Поэтому здесь я привожу три программные реализации этого алгоритма: 1) Классический (иногда ещё его называют наивным) ijk-алгоритм, использующий для вычисления c[i,j] элемента скалярное произведение i-ой строки матрицы A и j-ого столбца матрицы B. 2) Уже более хитрый чем первый ikj-алгоритм, умножающий i-строку матрицы A на j-ю строку матрицы B, для того чтобы вычислить каждый элемент матрицы C. 3) Блочный алгоритм, в котором квадратные матрицы A,B,C разбиваются на квадратные блоки, размером bsizexbsize и потом перемножаются между собой так же как и элементы матриц, при обычном не блочном умножении. Note: для простоты реализации матрицы A,B,C берутся квадратными одной и той же размерности. Используется арифметика двойной точности. Реализации этих алгоритмов на трех языках (Java, С++ и Fortran) приведены ниже:
В забеге участвовали след. компиляторы/интерпретаторы: • GNU FORTRAN v 4.4.0 • INTEL VISUAL FORTRAN v 11.1.038 • GNU C++ v 4.4.0 • INTEL C++ v 11.1.035 • MSVS C++ v 8.00.50727.42 (из MSVS 2005) • SUN CLIENT JVM 1.6_16 • SUN SERVER JVM 1.6_16 • EXCELSIOR JET 4.6 • GNU JAVA v 4.4.0 Для тестов брались квадратные вещественные матрицы размерноcтью 512,1024,2048 и 4096. Каждый компилятор тестировался с разными ключами оптимизации. Тестовая машина: OS Windows XP, CPU AMD Athlon64x2 2.41GHZ L1 = 64KB L2 = 512KB,400MHZ DDR 1GB Вот результаты проведенного тестирования: В каждой из таблиц приведено время, затраченное на выполнение умножения матриц. Классический алгоритм: ![]() Оптимизированный алгоритм: ![]() Блочный алгоритм: ![]() Лучшие результаты для каждого компилятора я вынес в гистограммы производительности: ![]() ![]() ![]() Итак, как и ожидалось, самый быстрый код создают компиляторы от Интел. Пока им нет равных. Особенно это заметно на классическом варианте умножения матриц. В этом алгоритме изначально порядок следования циклов далеко не оптимальный. Это скорее всего улавливают компиляторы от Интел и располагает его нужным образом, а также задействуют векторизацию и др. оптимизации. Всё это позволяет "нихрена не делая" сделать почти безнадежный классический алгоритм очень эффективным. Другие компиляторы этого пока не могут. Поэтому приходится оптимизировать алгоритмы вручную. Блочный и ikj-алгоритмы за счет более эффективной работы с кэш памятью процессора позволяют несколько приблизится к результатам, полученным интелом. Что же касается Java, то серверная JVM от Sun на некоторых тестах выглядит достаточно достойно, почти на уровне MSVS C++ и GNU G++. Клиентская версия конечно ещё сильно отстает от своих конкурентов. Компиляторы из Java напямую в машинный код не везде так быстры как ожидалось. Того же касается и GNU Fortran. От него я ожидал большего. Вывод: Если нет времени на оптимизацию программы то стоит взять компилятор от Интел, включив по возможности высокий уровень оптимизации (ключи /O3 /fast). Если результат не удовлетворителен или если есть время, то стоит повозится с оптимизацией циклов. Можно применить след. способы оптимизации: блокирование циклов, разворот самого внутреннего цикла, если он короткий, заюзать векторизацию и регистры. Кстати говоря благодяря последним двум мне удалось обогнать компилятор от Интел, но здесь уже нужно писать на ASM-е. Было бы не плохо узнать какие результаты получатся на процессоре Intel. Это сообщение отредактировал(а) Vitaly333 - 12.10.2009, 22:57 |
||||||
|
|||||||
Xaker88 |
|
||||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 6.8.2009 Репутация: нет Всего: нет |
Джава в 10 раз медленней чем С# Java(NetBeans) - 700 milliseconds C#(MonoDevelop) - 70 milliseconds Может делаю что то не так? Это сообщение отредактировал(а) Xaker88 - 3.11.2009, 16:13 |
||||
|
|||||
Temdegon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 429 Регистрация: 11.10.2008 Где: Minsk Репутация: 7 Всего: 9 |
Вы тестируете непонятно что. Так можно тестировать какой-нить компилятор паскаля 1985 года или интерпретатор Basic для ПК Ратон, но не языки с динамической компиляцией.
Ваш метод factorial замениться вычисленным в первой итерации значением либо на этапе компиляции, либо уже в процессе выполнения. Когда конкретно это произойдет - зависит от используемого компилятора и виртуальной машины. Теоретически, серверная JVM 1.6 сначала выбросит функцию, т.к. она реально не нужна, потом и сам цикл признает бесполезным =). Но на какой итерации это произойдет - я не знаю. Так же я не уверен, что клиентская jvm будет это делать. В общем, читайте очень познавательную статью на эту тему. линк Это сообщение отредактировал(а) Temdegon - 3.11.2009, 23:36 |
|||
|
||||
LamerTM |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 97 Регистрация: 11.3.2006 Репутация: нет Всего: 0 |
Осилил всю тему.
![]() Тест с факториалом на C++ у меня проходит за 0 ms (на VS2005). Похоже оптимизатор что-то там мудрит. Поэтому изменил тест следующим образом: C++:
C#:
Delphi:
Вместо вызова функции FactorialI в теле цикла можно подставить вызов FactorialD (результаты будут разными). Для FactorialI: C++: 2390 ms C#: 2453 ms Delphi7: 4156 ms Для FactorialD: C++: 4828 ms C#: 5453 ms Delphi7: 11156 ms Java у меня нет. Это сообщение отредактировал(а) LamerTM - 17.11.2009, 13:47 |
||||||
|
|||||||
Bozo |
|
||||
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 5.4.2006 Репутация: нет Всего: нет |
|
||||
|
|||||
Karadul |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 378 Регистрация: 18.5.2006 Репутация: 0 Всего: 1 |
||||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |