настройка производительности — есть ли алгоритм, который работает в Mathematica быстрее, чем в C или Fortran?

Эталон

Этот тест сравнивает наивную реализацию C векторного добавления со встроенным векторным добавлением Mathematica. Я использую свой пакет LTemplate, чтобы сэкономить некоторые усилия при подключении программы C к Mathematica, но это совершенно не имеет значения для теста.

 Needs["LTemplate`"] SetDirectory@CreateDirectory[] template = LClass["Adder", {LFun["add", {{Real, 1, "Constant"}, {Real, 1, "Constant"}}, {Real, 1}]} ]; code = " struct Adder { mma::RealTensorRef add(mma::RealTensorRef a, mma::RealTensorRef b) { auto res = mma::makeVector{amp}lt;double{amp}gt;(a.size()); for (mint i=0; i {amp}lt; res.size();   i) res[i] = a[i]   b[i]; return res; } }; "; Export["Adder.h", code, "String"]; CompileTemplate[template] LoadTemplate[template] adder = Make[Adder] a = RandomReal[1, 100000000]; b = RandomReal[1, 100000000]; RepeatedTiming[c1 = adder@"add"[a, b];, 10] (* {0.4838, Null} *) RepeatedTiming[c2 = a   b;, 10] (* {0.1809, Null} *) c1 == c2 (* True *) 

Среда тестирования: Mathematica 12.0.0, Ubuntu 16.04, GCC 6.5.0, Intel (R) Xeon (R) CPU E5-2660 v3 @ 2.60 ГГц, флаги компиляции — CreateLibrary умолчанию CreateLibrary (то есть -O2 ), исправленные с -std=c 11 .

Понравилась статья? Поделиться с друзьями:
JavaScript & TypeScript
Adblock
detector