Îro em dixwazin li ser hin nûvekirinên herî paşîn ên pergala Sherlock bipeyivin [ev li Zanîngeha Stanford komek performansa bilind e - nêzîkê. trans.], ku tomarkirina pelan di pelrêçan de bi hejmareke mezin ji navnîşan bi girîngî bileztir dike.
Berevajî gotarên birêkûpêk, ev bêtir raporek hundurîn e ku em çawa bi rêkûpêk li ser Sherlock dixebitin da ku ew ji bo bikarhênerên xwe di çêtirîn xwe de bimeşîne. Em hêvî dikin ku di pêşerojê de bêtir gotarên bi vî rengî biweşînin.
Lîsteya gelek pelan wext digire
Hemî bi pirsek piştgiriya teknîkî ya ji bikarhênerek dest pê kir. Wî pirsgirêka darvekirinê ragihand ls
Di pelrêçekê de ku ji zêdetirî 15 navnîşan tê de çend hûrdeman digire $SCRATCH
[Pelrêka pelên demkî - nêzîkî. kûçe].
Bi hezaran pelên di yek pelrêça de bi gelemperî bargiraniyek ji pergala pelan re çêdikin û bê guman nayê pêşniyar kirin. Bikarhêner ev yek dizanibû û qebûl kir ku ew ne baş e, lê destnîşan kir ku navnîş li ser laptopa wî 1000 carî ji Sherlock zûtir bû. Bê guman, ev yek zirarê dide me. Ji ber vê yekê me kûrtir dît.
Ji ber ku ew xweş xuya dike
Me dît ku ew bi rastî çi dike ls
dema navnîşkirina pelrêçek, û çima pêvajo ewqas dirêj digire. Li ser piraniya belavkirinên nûjen ls
ji hêla xwerû ve ew wekî dimeşe ls --color=auto
, ji ber ku her kes ji rengan hez dike.
Lê rengên bedew bihayek têne: ji bo her pelê ls
divê di derbarê cureya pelê, destûrên wê, al, taybetmendiyên berfireh û yên wekî wan de agahdarî bistînin da ku rengê guncan hilbijêrin.
Yek çareseriyek hêsan a pirsgirêkê ev e ku meriv rengê di ls-ê de bi tevahî neçalak bike, lê hêrsa bikarhêneran bifikire. Di bin şert û mercan de nabe ku hûn hilberîna rengîn jê derxin, em ne cinawir in.
Ji ber vê yekê me kûrtir dît. ls
têketinên rengan bi guhêrbara jîngehê LS_COLORS
, ku tê danîn dircolors(1)
li ser bingeha pelê veavakirinê dir_colors(5)
. Erê,
Werin em ji nêzîk ve lê binêrin
Ji bo ku diyar bikin ka kîjan nexşeya rengîn dibe sedema hêdîbûnê, me hawîrdorek ceribandinê çêkir:
$ mkdir $SCRATCH/dont
$ touch $SCRATCH/dont/{1..10000} # don't try this at home!
$ time ls --color=always $SCRATCH/dont | wc -l
10000
real 0m12.758s
user 0m0.104s
sys 0m0.699s
Ji bo 12,7 pelan 10 çirke, ne pir baş e.
Bi awayê, ji me re ala lazim e
--color=always
: tevî ku ew dizivirels --color=auto
, lêls
dema ku ew bi termînalekê ve ne girêdayî ye (mînak bi boriyê an bi beralîkirina derketinê) nas dike û heke li ser were danîn rengdêriyê asteng dike.auto
. Zilamê jîr.
Ji ber vê yekê çi dirêj dibe? Me lê nêrî strace
:
$ strace -c ls --color=always $SCRATCH/dont | wc -l
10000
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
44.21 0.186617 19 10000 lstat
42.60 0.179807 18 10000 10000 getxattr
12.19 0.051438 5 10000 capget
0.71 0.003002 38 80 getdents
0.07 0.000305 10 30 mmap
0.05 0.000217 12 18 mprotect
0.03 0.000135 14 10 read
0.03 0.000123 11 11 open
0.02 0.000082 6 14 close
[...]
Wow: 10 bang lstat()
, 10 bang getxattr()
(ku hemî têk diçin ji ber ku hawîrdora me ne xwediyê taybetmendiyên ku ls lê digere ne), 10 bang capget()
.
Bê guman ev dikare were xweşbîn kirin.
Taybetmendiyên kapasîteyê? Nexêr
Li pey şîret
$ eval $(dircolors -b | sed s/ca=[^:]*:/ca=:/)
$ time strace -c ls --color=always $SCRATCH/dont | wc -l
10000
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
98.95 0.423443 42 10000 lstat
0.78 0.003353 42 80 getdents
0.04 0.000188 10 18 mprotect
0.04 0.000181 6 30 mmap
0.02 0.000085 9 10 read
0.02 0.000084 28 3 mremap
0.02 0.000077 7 11 open
0.02 0.000066 5 14 close
[...]
------ ----------- ----------- --------- --------- ----------------
100.00 0.427920 10221 6 total
real 0m8.160s
user 0m0.115s
sys 0m0.961s
Wow, heya 8 çirkeyên lezbûnê! Em ji wan hemû bangên biha xilas bûn getxattr()
, û dijwariyan capget()
wenda jî bû, mezin.
Lê dîsa jî ev bangên acizker hene lstat()
, Her çend…
Ji te re çend kulîlk lazim in?
Ji ber vê yekê, me ji nêz ve nihêrî LS_COLORS
.
Pêşî me bi tenê ev guhêrbar neçalak kir:
$ echo $LS_COLORS rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36: $ unset LS_COLORS $ echo $LS_COLORS $ time ls --color=always $SCRATCH/dont | wc -l 10000 real 0m13.037s user 0m0.077s sys 0m1.092s
Çi!?! Hîn 13 saniye?
Derdikeve holê ku dema guhêrbar jîngehê LS_COLORS
tenê hêmanek wê ne diyar e an jî winda ye <type>=color:
, ew databasa çêkirî ji hêla xwerû ve bikar tîne û hîn jî rengan bikar tîne. Ji ber vê yekê heke hûn dixwazin ji bo celebek pelek diyar rengdarkirinê neçalak bikin, hûn hewce ne ku wê jê re derbas bikin <type>=:
an <type> 00
di dosyayê de DIR_COLORS
.
Piştî gelek ceribandin û xeletiyan, me lêgerîna xwe li ser vê yekê teng kir:
EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00
ku wek hatiye nivîsîn
LS_COLORS='ex=00:su=00:sg=00:ca=00:'
Ev tê wê wateyê: pelan bi taybetmendiyê reng nekin.
, ne ji aliyê
Em lez dikin ls
Û heke hûn yek ji van kontrolan nekin, wê hingê bang bikin lstat()
winda dibin, û naha ew mijarek bi tevahî cûda ye:
$ export LS_COLORS='ex=00:su=00:sg=00:ca=00:'
$ time strace -c ls --color=always $SCRATCH/dont | wc -l
10000
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
63.02 0.002865 36 80 getdents
8.10 0.000368 12 30 mmap
5.72 0.000260 14 18 mprotect
3.72 0.000169 15 11 open
2.79 0.000127 13 10 read
[...]
------ ----------- ----------- --------- --------- ----------------
100.00 0.004546 221 6 total
real 0m0.337s
user 0m0.032s
sys 0m0.029s
0,3 seconds li ser lîsteya 10 pelan, tomar.
Sazkirina Sherlock
Ji 13 çirkeyan bi mîhengên xwerû heya 0,3 çirkeyan bi verastkirinên piçûk LS_COLORS
tê wateya lezbûna 40 qatî ji ber tunebûnê setuid
/ setgid
û pelên darvekirî yên rengîn. Ne windahiyek wisa mezin.
Bê guman, ev naha li Sherlock ji bo her bikarhênerek hatî mîheng kirin.
Lê heke hûn dixwazin rengîniyê vegerînin, hûn dikarin tenê vegerin mîhengên xwerû:
$ unset LS_COLORS
Lê dûv re li ser pelrêçên bi gelek pelan, pê ewle bin ku hûn qehweyê dimeşînin dema ku ew dimeşe ls
.
Source: www.habr.com