Názor k článku Šikovný počtář FreeMat od highegg - Taková čísla obvykle stojí dost na vodě, protože...

  • Článek je starý, nové názory již nelze přidávat.
  • 4. 5. 2010 10:11

    highegg

    Taková čísla obvykle stojí dost na vodě, protože záleží na tom, co počítáte a hlavně jak to naprogramujete. „V některých situacích“ je navíc extrémně vágní pojem, a vůbec bych se nedivil, kdyby v jiných „některých situacích“ byl FreeMat rychlejší než Matlab.
    Nicméně, jinak mám podobnou zkušenost. Aby to nestálo na vodě, zde je konkrétní benchmark skript testující rychlost několika základních indexovacích operací s poli: http://artax.karlin.mff.cuni.cz/~hajej2am/ulozna/benchmark_index.m

    Matlab 2007a:

    >> benchmark_index (4e6, 100)
    time_slice1 = 3.573355
    time_slice1s = 2.051805
    time_slice1v = 6.820354
    time_slice2c = 1.625231
    time_slice2r = 5.991104
    time_slice2cv = 1.493305
    time_slice2rv = 6.671994
    time_slicenc = 0.962447
    time_slicend = 0.972687
    time_slicens = 0.568007
    time_slicen2 = 0.962911
    time_spreadr = 4.748844
    time_spreadc = 0.851502

    FreeMat 4.0.1, fresh build (s LLVM) (doporučuju zajít po spuštění na oběd)

    → benchmark_index (4e6, 100)
    time_slice1 = 47.162000
    time_slice1s = 22.715000
    time_slice1v = 43.019000
    time_slice2c = 240.617000
    time_slice2r = 242.140000
    time_slice2cv = 243.359000
    time_slice2rv = 242.150000
    time_slicenc = 98.668000
    time_slicend = 98.798000
    time_slicens = 27.865000
    time_slicen2 = 80.781000
    time_spreadr = 241.160000
    time_spreadc = 242.419000

    zatímco Matlabu celý skript trvá 37 sekund (a to je tři roky stará verze), FreeMat se s ním moří více než půl hodiny. Pro srovnání, zde je Octave 3.3.51+:

    octave:1> benchmark_index (4e6, 100)
    time_slice1 = 0.000502
    time_slice1s = 1.084566
    time_slice1v = 1.972065
    time_slice2c = 0.000671
    time_slice2r = 1.630831
    time_slice2cv = 1.505355
    time_slice2rv = 1.723218
    time_slicenc = 0.000915
    time_slicend = 0.541328
    time_slicens = 0.498534
    time_slicen2 = 0.783243
    time_spreadr = 1.350102
    time_spreadc = 0.911790

    to není tak úplně fér, protože 3.3.51+ není stable release a tahle binárka je navíc sestavená s celkem agresivním -O3 -march=native. 3.2.4 s výchozím nastavením je v některých bodech znatelně horší:

    octave:1> benchmark_index (4e6, 100)
    time_slice1 = 0.000623
    time_slice1s = 1.093462
    time_slice1v = 4.181895
    time_slice2c = 0.000865
    time_slice2r = 1.708514
    time_slice2cv = 1.629910
    time_slice2rv = 1.732078
    time_slicenc = 0.001144
    time_slicend = 0.569461
    time_slicens = 0.494025
    time_slicen2 = 1.137449
    time_spreadr = 1.358040
    time_spreadc = 1.359391

    Je paradoxní, že ačkoliv FreeMat podporuje JIT kompilaci (jako Matlab) a Octave nikoliv, snad na všech reálných i pokusných skriptech mi FreeMat chodí pomaleji, někdy dost výrazně. Z toho je vidět že i z pouhého interpretru se dá vytřískat celkem dost, pokud se v něm programuje stylem lepení vestavěných funkcí a ty jsou silně optimalizované. Kdyby bylo možné oba projekty (octave a FreeMat) spojit a z každého si vzít to lepší, výsledek by zřejmě byl skvělý.

    V každém případě, existují:
    1. lži
    2. velké lži
    3. benchmarky