быстрое/быстрое целочисленное умножение в рубине?

Исключение Гаусса Правила Крамера и является двумя хорошими, алгоритмами общего назначения (также см. Одновременные Линейные уравнения ). Если Вы ищете код, проверяете GiNaC, Максимумы , и SymbolicC ++ (в зависимости от Вашего лицензирования требований, конечно).

РЕДАКТИРОВАНИЕ: Я знаю, что Вы работаете на земле C, но я также должен произнести оправдательную речь по адресу SymPy (компьютерная система алгебры в Python). Можно узнать о много из его алгоритмов (если можно прочитать немного Python). Кроме того, это находится под новой лицензией BSD, в то время как большинство бесплатных математических пакетов является GPL.

5
задан nathanvda 24 November 2009 в 18:12
поделиться

3 ответа

1.8.6 в этой области работает медленнее. 1.8.7 работает немного лучше, а 1.9.1 - еще лучше. Не могу сказать почему, но rvm согласен с вами и Павлом в том, что 1.8.6 странно медленная.

1.8.6: 
Rehearsal ------------------------------------------------
float-multip   0.140000   0.000000   0.140000 (  0.141560)
float-square   0.150000   0.000000   0.150000 (  0.146286)
int-multip     0.220000   0.000000   0.220000 (  0.223255)
int-multip     0.180000   0.000000   0.180000 (  0.183850)
--------------------------------------- total: 0.690000sec

1.8.7:
Rehearsal ------------------------------------------------
float-multip   0.090000   0.000000   0.090000 (  0.092346)
float-square   0.080000   0.000000   0.080000 (  0.080335)
int-multip     0.070000   0.000000   0.070000 (  0.068012)
int-multip     0.080000   0.000000   0.080000 (  0.081713)
--------------------------------------- total: 0.320000sec

1.9.1:
Rehearsal ------------------------------------------------
float-multip   0.070000   0.000000   0.070000 (  0.065532)
float-square   0.080000   0.000000   0.080000 (  0.081620)
int-multip     0.060000   0.000000   0.060000 (  0.065371)
int-multip     0.070000   0.000000   0.070000 (  0.065761)
--------------------------------------- total: 0.280000sec
3
ответ дан 14 December 2019 в 04:40
поделиться

На ум приходит пара вещей . Вы не указываете, какую реализацию Ruby используете. Поскольку вы запускаете Ruby 1.8.6 в Windows,

В последних двух случаях вы можете немного пересмотреть свои тесты. Оба в конечном итоге могут скомпилировать код Ruby в машинный код, но это может занять некоторое время. Например, JRuby компилируется в байт-код JVM после того, как метод был выполнен 20 раз, а HotSpot Server компилирует байт-код JVM в собственный машинный код после его выполнения 20000 раз. Кроме того, сама компиляция требует времени, поэтому программе необходимо некоторое время, чтобы вернуть эту стоимость за счет повышения производительности.

В частности, Чарльз Оливер Наттер, один из ведущих разработчиков JRuby, сказал, что в зависимости от рабочей нагрузки JRuby может для набора полной скорости требуется до 5-15 секунд. Ваши тесты примерно в 100 раз быстрее (вот предложение, которое вы не слышите каждый день ...).

но это может занять некоторое время. Например, JRuby компилируется в байт-код JVM после того, как метод был выполнен 20 раз, а HotSpot Server компилирует байт-код JVM в собственный машинный код после его выполнения 20000 раз. Кроме того, сама компиляция требует времени, поэтому программе необходимо некоторое время, чтобы вернуть эту стоимость за счет повышения производительности.

В частности, Чарльз Оливер Наттер, один из ведущих разработчиков JRuby, сказал, что в зависимости от рабочей нагрузки JRuby может для набора полной скорости требуется до 5-15 секунд. Ваши тесты примерно в 100 раз быстрее (вот предложение, которое вы не слышите каждый день ...).

но это может занять некоторое время. Например, JRuby компилируется в байт-код JVM после того, как метод был выполнен 20 раз, а HotSpot Server компилирует байт-код JVM в собственный машинный код после его выполнения 20000 раз. Кроме того, сама компиляция требует времени, поэтому программе необходимо некоторое время, чтобы вернуть эту стоимость за счет повышения производительности.

В частности, Чарльз Оливер Наттер, один из ведущих разработчиков JRuby, сказал, что в зависимости от рабочей нагрузки JRuby может для набора полной скорости требуется до 5-15 секунд. Ваши тесты примерно в 100 раз быстрее (вот предложение, которое вы не слышите каждый день ...).

Сама компиляция требует времени, поэтому программе необходимо время, чтобы вернуть эту стоимость за счет повышения производительности.

В частности, Чарльз Оливер Наттер, один из ведущих разработчиков JRuby, сказал, что в зависимости от рабочей нагрузки JRuby может занять до 5-15 секунд, чтобы набрать полную скорость. Ваши тесты примерно в 100 раз быстрее (вот предложение, которое вы не слышите каждый день ...).

Сама компиляция требует времени, поэтому программе необходимо время, чтобы вернуть эту стоимость за счет повышения производительности.

В частности, Чарльз Оливер Наттер, один из ведущих разработчиков JRuby, сказал, что в зависимости от рабочей нагрузки JRuby может занять до 5-15 секунд, чтобы набрать полную скорость. Ваши тесты примерно в 100 раз быстрее (вот предложение, которое вы не слышите каждый день ...).

5
ответ дан 14 December 2019 в 04:40
поделиться

Я не могу объяснить ваши таблицы. Но я могу объяснить свой (рубин 1.8.7):

                   user     system      total        real
float-multip   0.600000   0.000000   0.600000 (  0.612311)
float-square   0.650000   0.000000   0.650000 (  0.649399)
int-multip     0.450000   0.010000   0.460000 (  0.457004)
int-multip     0.690000   0.000000   0.690000 (  0.692879)

Упс. Целочисленное умножение превосходит умножение с плавающей запятой.

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

** , вероятно, использовала арифметику с плавающей запятой (exp (x * ln (2)), поэтому она такая же медленная, как и другие операции с плавающей запятой.

0
ответ дан 14 December 2019 в 04:40
поделиться
Другие вопросы по тегам:

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