https://github.com/haa-zee/proc_speedtest/blob/master/Proc_Speed_Test.j…
A feladvány annyi volt, hogy a /proc/[0-9]*/stat fájlokból kiolvasson egyetlen sort minél gyorsabban, 10000 alkalommal.
A pythonos változata kb. 40s alatt futott, ennek az eredetije, tutorialokból összeollózva 55-65s, a jelenlegi, némi doksi olvasás után kb. 35s.
Az optimalizálás annyiból állt, hogy amit lehetett cikluson kívülre tettem és a "new BufferedReader( new FileReader(...) )" helyére "Files.newBufferedReader(...)" került.
Lehet ezen még gyorsítani?
- 1279 megtekintés
Hozzászólások
Algoritmikusan rendben, a kodban már sokminden nem áthelyezheto. 4.5ms/iteracio elég jó eredmény, már csak a csúnya kernel ne irogatna a fájlokat.
- A hozzászóláshoz be kell jelentkezni
Mi van a kernellel?? Ezt most nem értem...
Az access time update-jére gondolsz?
Egyébként nem is algoritmus gyorsításra gondoltam, inkább arra, hogy esetleg más osztályok használatával gyorsulhat még.
- A hozzászóláshoz be kell jelentkezni
Gyorsba csekkeltem alternativ modon, szvsz ez itt mar a kernelen mulik.
@snail:~/tbs/lua/proc_stat_speed_test$ time ./luajit test.lua
4108285 0
real 0m42.784s
user 0m13.936s
sys 0m28.348s
A luajit sajat patch-el optimalizalt, lfs szintugy, a szuboptimalis lua kod meg ez volt:
@snail:~/tbs/lua/proc_stat_speed_test$ cat test.lua
require 'lfs'
sDir = '/proc'
ctr, err = 0, 0
for i = 0, 10000, 1 do
for sFileName in lfs.dir( sDir ) do
if string.match( sFileName, '^[0-9]*$' ) then
local fStatFile = io.open( sDir ..'/'.. sFileName ..'/stat', 'r' )
if fStatFile then
local sLine = fStatFile:read()
if sLine then
ctr = ctr +1
else
err = err +1
end
fStatFile:close()
end
end
end
end
print( ctr, err )
szerk.: nem baratsagos a tabulalas, szori.
- A hozzászóláshoz be kell jelentkezni
Köszi, de továbbra sem értem, a kernel hol befolyásolja a dolgokat.
A teszt onnan ered egyébként, hogy kíváncsi voltam, egy saját monitoring program, ami többek közt a processzeket figyeli, mennyire terhelné a gépet különböző nyelveken. Szóval a lényeg csak annyi, hogy azonos gépen milyen eltérések vannak a különböző megvalósítások között.
- A hozzászóláshoz be kell jelentkezni
1 file-tartalom felovasasa legalabb 3 fs kernelhivas. A feladat 3/4-e a kernelben zajlik. Talan vmi kernelhook-os trukkel lehetne meg faragni, de az meg rendszerszinten "fekez".
Igazabol elegedett vagyok az egyszalas sebessegevel, azert nem rossz 4 millio fajl open-read-close 40sec alatt. :D
- A hozzászóláshoz be kell jelentkezni
Na B+! Az én gépemen, a gyári ubuntus csomagokkal (lua-filesystem, lua5.1, luajit) ugyanolyan gyors, mint a C...
ui: felrakhatom ezt is a repoba, linkelve a fenti hozzászólásodat, mint forrást?
- A hozzászóláshoz be kell jelentkezni
Hogyne, vigyed. A lua jit egyebkent c sebessegu kodot tud majdnem minden esetben. A legjobb jit - a plan9 alkotoi szerint (is). :DDD
szerk.: Figyi, a repo leirasaba a processzek szamat erdemes lenne beirni, a cpuinfo-val egyutt.
- A hozzászóláshoz be kell jelentkezni
Köszi!
Azért ettől a luajit-től padlót fogtam rendesen... :)
Főleg azt követően, hogy állítólag a java JIT közel natív sebességet produkál a marketing szerint.
(mondjuk az eddigiek szerint nem kizárt, hogy valóban, csak a különböző package-ek használata annyit lassít rajta, hogy nem igazán látszik)
- A hozzászóláshoz be kell jelentkezni
Ha erdekel kozelebbrol is, nagyon javaslom a kozelrol megtekinteset. Nagyon okos mind a lua, mind a jit megvalositasa. Nem is ertem, hogy pl. a python/ruby sloware hogy birt eletben maradni mellette. :DDD (Ha asol picit, akkor a tarantool meg fasza cucc.)
A jvm meg nagyon sok mindent tesz melle, szoval piszkosul nem egy ligaban buliznak azert.
Go/Rust implementaciot nem tervezel..?
- A hozzászóláshoz be kell jelentkezni
Egyelőre nem tervezek újabb nyelveket, mert maga a teszt értelmetlen, öncélú, eredetileg csak azok a nyelvek szerepeltek, amikbe valamennyire belekontárkodtam.
A java-t is láthatod, mennyire sikerült el...nom, mert csak tutorialokból vagdostam ki a darabjait.
- A hozzászóláshoz be kell jelentkezni
Processzek száma, mint ps xa | wc -l?
- A hozzászóláshoz be kell jelentkezni
A counter output/10000. Nalam pl. 390 es 420 kozott ugralt a meres soran. Igy jott ki a 4szaztizenvmennyi a vegen.
- A hozzászóláshoz be kell jelentkezni
O.K., csak azért kérdeztem, hogy egyről beszélünk-e.
Azért is nincs értelme ennek a tesztnek a saját környezetemen kívül, mert millió+1 dolog befolyásolja, nem csak a proci és a különböző fordítók/interpreterek által előállított kódok sebessége.
- A hozzászóláshoz be kell jelentkezni
Nalam sokat gyorsitott, miutan lecsereltem a
Files.newBufferedReader( path ) )
-ra ;)
Files.newBufferedReader( path2file ) )
- A hozzászóláshoz be kell jelentkezni
Basszus... hibás állapotot küldtem fel a githubra :(((
Szerintem így "gyorsabb", csak nem csinál semmit ;)
Hülyébb vagyok, mint hittem. Nem csak a repoba került hibásan, így is teszteltem :(
Érdekes, hogy a directory-t(??) simán beolvasta, hibaüzenet nélkül. :)
Így valóban gyorsabb, nyertem vele még 3 mp-et...
Köszi.
Githubon is javítva.
- A hozzászóláshoz be kell jelentkezni
Ez meg gyorsabb:
for(Path path : stream){
Path path2file = path.resolve("stat");
try ( Stream br = Files.lines(path2file))
{
String line;
line = br.findFirst().get();
ctr++;
} catch(IOException e){
err++;
}
}
a stream persze string generic parammal van, csak kiszedi a drupaaal
----------------------
while (!sleep) sheep++;
- A hozzászóláshoz be kell jelentkezni
Köszi, ezt még emésztem.
Ezt kell beírni, hogy ne tűnjön el a generic:
Stream<Generic>
Még1x köszi: nálam ez a verzió "statisztikailag" azonos eredményt produkál, mint az eredeti: 26-32s között.
- A hozzászóláshoz be kell jelentkezni