Dema ku guherbarek jîngehê pêvajoyê 40 carî lez dike

Î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ê, îcrakar pelê veavakirinê dixwîne da ku guhêrbarek jîngehê biafirîne, ku paşê bikar tîne (û heke hûn li ser pelan nizanin ji hêla (bikin), paşê dir_colors dê bixebite, Tevî her tiştî).

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 dizivire ls --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 xeletiyek ji 10 sal berê, me hewl da ku kontrolkirina taybetmendiyê neçalak bikin Aborî:

$ 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. Aborî, lê piç bi bîsk setuid/setgid, ne ji aliyê ala cîbecîkirinê.

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

Add a comment