Práve som narazil na knižnicu NArray pre Ruby - prosím, ospravedlňte moju nevedomosť pri kladení tejto otázky :)
Aké sú výhody použitia knižnice NArray oproti štandardnej implementácii Ruby Array?
Videl som, že NArray je zameraný na numerické hodnotyvýpočtová technika, ale pri pohľade na API to vyzerá, že v Array existuje iba niekoľko rozšírení zameraných na numerické hodnoty - nič, čo by ste s Array nemohli robiť ..
- Prečo nepoužívať iba Array?
- Existuje obrovská rýchlostná výhoda?
- Existuje obrovská pamäťová výhoda?
- Máte nejaké ďalšie výhody oproti použitiu bežnej triedy Ruby Array?
Google skutočne neprišiel s užitočným vysvetlením tejto otázky.
Odkazy, ktoré som našiel:
http://rubydoc.info/gems/narray-ruby19/0.5.9.7/NArray
http://narray.rubyforge.org/index.html.en
http://raa.ruby-lang.org/project/narray/
odpovede:
10 pre odpoveď č. 1Pozri tiež snímku o NArray: http://www.slideshare.net/masa16tanaka/narray-and-scientific-computing-with-ruby
vyzerá to, že nad poľom je iba pár rozšírení
Nie, je to úplne iné ako v Array. NArray má veľa numerických funkcií a viacrozmerných funkcií. Na druhej strane je NArray statický; nemá metódy push / pop atď. Zoznam metód NArray je http://narray.rubyforge.org/SPEC.en
_1. Prečo nepoužívať iba Array?
Pole obsahuje rubínové objekty. Je neefektívne držať číselné hodnoty.
_2. Existuje obrovská rýchlostná výhoda?
Áno. str.36 vyššie uvedených prezentácií je NArray až 50-krát rýchlejší.
Všimnite si, že pole je rýchlejšie ako NArray, ak je slučka napísaná v Ruby.
_3. Existuje obrovská pamäťová výhoda?
Áno. Pokiaľ ide o hodnoty Float, Array spotrebuje na mojom 64bitovom stroji s Linuxom asi 4-krát viac pamäte ako NArray.
_4. Máte nejaké ďalšie výhody oproti použitiu bežnej triedy Ruby Array?
- Podpora viacrozmerného poľa
- Podpora numerických funkcií
- Na položky Array nie je potrebný zber odpadu. GC trvá dlho pre veľké polia.
- atď.
4 pre odpoveď č. 2
Videl som, že NArray je zameraný na numerické hodnotyvýpočtová technika, ale pri pohľade na API to vyzerá, že v Array existuje iba niekoľko rozšírení zameraných na numerické hodnoty - nič, čo by ste s Array nemohli robiť ..
Chýba vám najdôležitejší bod: NArray
nie je len predĺžený pre numerické spracovanie to tiež je obmedzený, Najmä
NArray
prvky môžu iba byť celé čísla alebo plaváky pevnej veľkostiNArray
Sami sú tiež pevnej veľkosti, nemôžu sa zmenšovať ani zväčšovať
Implementácia NArray
môcť využívať tieto obmedzenia poskytujú vynikajúci výkon.
1 pre odpoveď č. 3
Pri vytváraní veľkého typového poľa môže byť NArray rýchlejší, aj keď pri vytváraní malého poľa (napr. Pre dočasné prechodné objekty) sa zdá, že Ruby Array je rýchlejší, je rýchlejší.
Kód referenčného bodu:
require "benchmark"
n1 = 1000000
n2 = 10000
Benchmark.bm do |x|
x.report("NArray short float length 5:") { n1.times { NArray.sfloat(5) } }
x.report("NArray long float length 5 :") { n1.times { NArray.float(5) } }
x.report("NArray short int length 5 :") { n1.times { NArray.sint(5) } }
x.report("NArray long int length 5 :") { n1.times { NArray.int(5) } }
x.report("NArray object length 5 :") { n1.times { NArray.object(5) } }
x.report("Ruby Array length 5 :") { n1.times { Array.new(5) } }
x.report("NArray short float length 10000:") { n2.times { NArray.sfloat(10000) } }
x.report("NArray long float length 10000 :") { n2.times { NArray.float(10000) } }
x.report("NArray short int length 10000 :") { n2.times { NArray.sint(10000) } }
x.report("NArray long int length 10000 :") { n2.times { NArray.int(10000) } }
x.report("NArray object length 10000 :") { n2.times { NArray.object(10000) } }
x.report("Ruby Array length 10000 :") { n2.times { Array.new(10000) } }
end
výsledky:
user system total real
NArray short float length 5: 0.740000 0.020000 0.760000 ( 0.756466)
NArray long float length 5 : 0.770000 0.020000 0.790000 ( 0.791446)
NArray short int length 5 : 0.750000 0.020000 0.770000 ( 0.772591)
NArray long int length 5 : 0.760000 0.020000 0.780000 ( 0.777375)
NArray object length 5 : 0.780000 0.020000 0.800000 ( 0.801149)
Ruby Array length 5 : 0.450000 0.010000 0.460000 ( 0.461501) <====
NArray short float length 10000: 0.230000 0.050000 0.280000 ( 0.281369)
NArray long float length 10000 : 0.430000 0.000000 0.430000 ( 0.428917)
NArray short int length 10000 : 0.110000 0.010000 0.120000 ( 0.113683)
NArray long int length 10000 : 0.230000 0.040000 0.270000 ( 0.275942)
NArray object length 10000 : 0.460000 0.110000 0.570000 ( 0.570558)
Ruby Array length 10000 : 0.440000 0.040000 0.480000 ( 0.476690)