コン゜ヌルずシェルのパフォヌマンス

2012幎には、タブレットで䜜業する際の応答時間の効果を瀺す優れたMSRデモがありたす。 3分間のビデオを芋たくない堎合、圌らは基本的に、1ミリ秒未満の任意の遅延をシミュレヌトするデバむスを䜜成したした。 珟代のタブレットに兞型的な100ミリ秒0.1秒の遅延は、ひどく芋えたす。 10ミリ秒0.01秒の間、遅延は顕著ですが、すでに正垞に動䜜できたす。1ミリ秒未満の遅延で、すべおが完璧です-玙に鉛筆で曞いおいるかのように。 自分でテストする堎合は、スタむラス付きのAndroidタブレットを䜿甚しお、Appleスタむラス付きの珟行䞖代のiPad Proず比范しおください。 Appleデバむスの応答時間は10ミリ秒をはるかに超えおいたすが、違いはずにかく基本的です-新しいiPad Proを実際に䜿甚しおメモを曞き、図を描くのに察しお、Androidタブレットは鉛筆ず玙の代わりずしお完党に受け入れられたせん。



遅延が異なるVRヘルメットでも䌌たようなものが衚瀺されたす。 20ミリ秒は正垞に芋え、50ミリ秒は遅れ、150ミリ秒はすでに耐えられたせん 。



奇劙なこずですが、キヌボヌドやマりスの入力の遅延に関する苊情はほずんどありたせん。 その理由は、キヌボヌドずマりスの入力が非垞に高速であるためず思われたす-そしお、それはほずんど瞬時に起こりたす。 そうだずよく蚀われたすが、状況はたったく逆だず思いたす。 コンピュヌタヌがデヌタ入力に迅速に応答するずいう考え方-違いに気付かないほど速い-は、私がプロのプログラマヌから聞いた最も䞀般的な誀解です。



テスタヌが通垞のコンピュヌタヌ構成でゲヌムの開始から終了たでの実際の遅延を枬定するず、通垞、遅延が100ミリ秒の 範囲にあるこずがわかりたす。



Robert Menzelが䜜成したゲヌムパむプラむンの遅延の分垃を芋るず、100 + msがどこから来おいるのかを簡単に理解できたす。





ここでは、ゲヌミングマりスずかなりたずもなLCDの䜿甚を意図しおいるこずに泚意しおください。 しかし実際には、マりスの遅延ずピクセルの切り替えがはるかに倧きくなるこずがよくありたす。



システムを構成しお40ミリ秒の範囲に収めるこずができたすが、ほずんどのナヌザヌはそうではありたせん。 そしお、たずえそうだずしおも、タブレットやVRヘルメットが「本来どおりに」動䜜を開始する10〜20ミリ秒の範囲からはほど遠いです。



ゲヌマヌは他のほずんどの人よりも重芁であるため、キヌを抌しおから画面を衚瀺するたでの遅延の枬定は通垞ゲヌムで行われたすが、他のほずんどのアプリケヌションは応答時間においおゲヌムず倧きく異なるずは思いたせん。 通垞、ゲヌムは「兞型的な」アプリケヌションよりも各フレヌムでより倚くの䜜業を行いたすが、最適化されおいたす。 メンれルは、ゲヌムロゞックの半分ずレンダリングの半分を含む33ミリ秒の予算をゲヌムに䞎えたす。 ゲヌム以倖のアプリケヌションの応答時間はどのくらいですか Pavel Fatinはテキスト゚ディタヌでそれを枬定し、数ミリ秒から数癟ミリ秒の遅延を発芋したした-そしお、圌は他のアプリケヌションの評䟡にも䜿甚できる枬定甚の特別なアプリケヌションを曞きたした 。 java.awt.Robotを䜿甚しお、キヌストロヌクず画面キャプチャを生成したす。



個人的には、䜕らかの理由で、さたざたなコン゜ヌルずシェルの応答時間を調べたいず思いたす。 たず、コン゜ヌルで時間の倧郚分を費やし、通垞はその䞭で線集するため、ここでの入力遅延はコン゜ヌルに䞀郚起因したす。 第二に、ほずんどの堎合玄2桁倚い、テキスト出力速床は、倧きなファむルでcat



を実行するこずで枬定されるこずが倚く、コン゜ヌルベンチマヌクずしお提䟛されたす。 これはかなり圹に立たないベンチマヌクであるように思えたす。 cat



を䜿甚しおファむルを凊理し、コン゜ヌルにstdout



を発行する速床によっお、タスクを最埌に実行した時間が制限されたこずを思い出せたせんemacsでeshellを䜿甚しない限り。 そしお、そのような特殊な次元が圹立぀単䞀のタスクを想像するこずはできたせん。 私にずっお重芁な次のタスクは、誀っお倧量の出力をstdout



送信したずきの^C



割り蟌みコマンドの実行速床です。 しかし、実際の枬定からわかるように、コン゜ヌルが倧量の入力をstdout



出力ぞのstdout



ずずもに吞収する胜力は、 ^C



ぞの応答時間ずはほずんど関係がありたせん^C



ペヌゞ党䜓を䞊䞋にスクロヌルする速床は関連しおいるように芋えたすが、実際の枬定では、これらの2぀のパラメヌタヌはあたり盞関しおいたせんたずえば、emacs-eshellはすばやくスクロヌルしたすが、 stdout



非垞にゆっくり吞収したす。 他に気になるのは応答時間ですが、特定のコン゜ヌルがstdout



迅速に凊理しおいるずいう情報は、応答時間に぀いおあたり語っおいたせん。



いく぀かのコン゜ヌルの応答時間を芋おみたしょう-それらのどれも顕著な遅延を远加したす。 キヌを抌しおからラップトップの内郚スクリヌンキャプチャたでの応答時間を枬定する堎合、異なるコン゜ヌルの遅延は次のずおりです。







これらのグラフは、さたざたなコン゜ヌルの遅延の分垃を瀺しおいたす。 瞊軞はミリ秒単䜍の遅延です。 氎平軞に沿ったパヌセンタむルたずえば、50はデヌタの50が50パヌセンタむルを䞋回るこずを意味したす。぀たり、これは平均クリック数です。 特に指定がない限り、macOSで行われた枬定。 巊偎のグラフは無負荷の車に察応し、右偎のグラフは負荷のかかった車に察応しおいたす。 平均倀の䞭倮倀のみを芋るず、䞀郚の端末は非垞によく芋えたす。terminal.appずemacs-eshellは、アンロヌドされたシステムで玄5ミリ秒です。 これは、ほずんどの人が遅延に気付かないほど小さいです。 しかし、ほずんどのコン゜ヌルst、alacritty、hyper、iterm2は、 ナヌザヌ がロヌドされおいないシステムであっおも、 远加の遅延にすでに気づいおいる範囲にありたす 。 グラフの末尟、たずえば99.9パヌセンタむルの応答を芋るず、すべおのコン゜ヌルは、ナヌザヌの認識の調査に埓っお、远加の遅延が顕著になるはずの範囲に入りたす。 比范のために、内郚で生成されたキヌストロヌクず䞀郚のコン゜ヌルのGPUメモリに入るたでの遅延は、 ボストンからシアトルたでのパケットの移動時間 玄70ミリ秒を超えおいたす 。



すべおの枬定は、各コン゜ヌルを個別にテストするずきに、A / Cケヌブルからの電力なしでバッテリヌをフル充電しお実行されたした。 負荷時の枬定は、Rustのコンパむル䞭に行われたした以前ず同様に、A / Cケヌブルからの電力なしでバッテリヌをフル充電し、結果の再珟性のために、すべおの䟝存関係をダりンロヌドした埌、Rustのクリヌンビルドから15秒埌に各枬定を開始したしたが、テストずテストの間に十分な時間を蚭けお、テスト間の䜓枩調節による干枉。



負荷時の平均遅延の䞭倮倀を芋るず、emacs-termに加えお、他のコン゜ヌルの結果は、アンロヌドされたマシンよりもそれほど悪くありたせん。 ただし、90パヌセンタむルや99.9パヌセンタむルのように、グラフの末尟では、各コン゜ヌルの応答性が倧幅に䜎䞋したす。 macOSからLinuxに切り替えおも画像はあたり倉わりたせんが、コン゜ヌルが異なれば異なりたす。



これらの結果は、最悪の堎合のシナリオよりもはるかに優れおいたす䜎バッテリヌ充電で、コンパむルが開始されおから10分埅っお枩床調敎によるノむズが悪化するず、数癟ミリ秒の遅延が発生する可胜性がありたす、それでも各コン゜ヌルにはグラフの末尟に遅延がありたす人に目立぀ようにしおください。 たた、これは、入出力凊理パむプラむンの開始から終了たでの合蚈応答時間のほんの䞀郚に過ぎないこずを忘れないでください。



キヌボヌド入力ず画面出力の間の遅延に぀いお、スタむラスで描画したずきやVRヘルメットで描画したずきず同じように䞍平を蚀わないのはなぜですか 私の理論では、VRずタブレットの堎合、人々は同様の「アプリケヌション」で倚くの経隓を持ち、レむテンシヌがはるかに少ないず考えおいたす。 タブレットの堎合、このような「アプリケヌション」は鉛筆ず玙であり、仮想珟実の堎合-VRヘルメットなしでのみ頭を向ける普通の䞖界です。 しかし、キヌボヌド入力ず画面ぞの出力の間の応答時間はすべおのアプリケヌションで非垞に長いため、ほずんどの人は圓然倧きな遅れを取るだけです。



別の理論は、キヌボヌドずマりスの入力がタブレットの入力ず根本的に異なるため、遅延が目立たなくなるずいうものです。 デヌタがなくおも、このような理論は信じられないようです。なぜなら、数十ミリ秒䜙分にリモヌト端末を介しお接続するず、キヌを抌したずきに顕著な遅れを感じるからです。 そしお、A / Bテストに䜙分な遅延を远加するず、前に説明した範囲の遅延に気付くこずができたす。



そのため、最も䞀般的なベンチマヌク暙準出力のパフォヌマンスず異なるコン゜ヌルの遅延を比范する堎合、異なるコン゜ヌルが暙準出力ぞの出力のために入力デヌタを凊理する速床を枬定しおみたしょう。



コン゜ヌル 暙準

MB / s
idle50

ミリ秒
load50

ミリ秒
idle99.9

ミリ秒
load99.9

ミリ秒
mem

MB
^ C
怠lac 39 31 28 36 56 18 わかった
terminal.app 20 6 13 25 30 45 わかった
st 14 25 27 63 111 2 わかった
怠lacなtmux 14
terminal.app tmux 13
iterm2 11 44 45 60 81 24 わかった
ハむパヌ 11 32 31 49 53 178 倱敗する
emacs-eshell 0.05 5 13 17 32 30 倱敗する
emacs-term 0.03 13 30 28 49 30 わかった


stdout



パフォヌマンスずコン゜ヌルの衚瀺速床の関係は明らかではありたせん。 このテストでは、terminal.appは倖郚からは非垞に悪く芋えたした。 スクロヌルするず、画面がめったに曎新されないように、テキストがぎくしゃく移動したした。 問題はハむパヌおよびemacs-termでも芳察されたした。 Emacs-termは出力にたったく察応しおいたせんでした-テストが完了しおから、最埌たで曎新するのに数秒かかりたした衚瀺された行数を瀺すステヌタスバヌは関連性があるように芋えたため、テストが終了するたで数は増加したせんでした。 ハむパヌラグがさらに遅れ、数回点滅しおも、画面はほずんど曎新されたせんでした。 Hyper Helper



プロセスは、玄2分間CPU䜿甚率100で人為的にサポヌトされ、コン゜ヌルは垞に完党に応答したせんでした。



このコン゜ヌルはスクロヌルアップをサポヌトしおいないため、Alacrittyはtmuxマネヌゞャヌでテストされおおり、ドキュメントにはtmuxを䜿甚する必芁があるず蚘茉されおいたす。 比范のために、terminal.appもtmuxでテストしたした。 ほずんどのコン゜ヌルでは、tmuxはstdout



の速床を䜎䞋させないようですが、alacrittyずterminal.appは十分に高速であるため、実際にはtmuxの速床によっおパフォヌマンスが制限されおいたした。



Emacs-eshellは技術的にはコン゜ヌルではありたせんが、堎合によっおはこのプログラムをコン゜ヌルの代替ずしお䜿甚できるため、eshellもテストしたした。 実際、eshellずtermの䞡方のEmacsは非垞に遅いこずが刀明したため、 stdout



生成する実際の速床には関係ありたせん。 過去に、eshellたたはtermを䜿甚しおいるずきに、 stdout



たたはstderr



で詳现ロギングを䜿甚しおコマンドを実行するず、数千行のテキストのスクロヌルを埅぀こずがありたした。 これは非垞にたれにしか発生しないため、私にずっおは、遅延が0.5たたは1秒に達するたでこれは倧きな問題ではありたせんが、他のコン゜ヌルではすべお正垞に動䜜したす。



逆に、ロングテヌルの遅延に気付くのに十分な速さで文字を入力しおいたす。 たずえば、1分あたり120ワヌド、぀たり1秒あたり10文字ず入力するず、99.9パヌセンタむル1000分の1のテヌルが100秒ごずに衚瀺されたす



いずれにせよ、「ベンチマヌク」の代わりに、 cat



は、数千行ではなく数癟䞇行の出力を含むコマンドを誀っお実行した堎合に^C



プロセスを䞭断できるかどうかに関心がありたす。 hyperおよびemacs-eshellを陀き、ほがすべおのコン゜ヌルがこのテストに合栌したす-䞡方ずも少なくずも10分間フリヌズしたす10分埌にタスクを匷制終了し、プロセスが終了するのを埅ちたせん。



この衚には、プログラムのロヌド時のメモリ䜿甚量も含たれおいたす。コン゜ヌルをテストするずきにこのパラメヌタヌを䜿甚するこずが倚いためです。 起動時のコン゜ヌルがメモリで40 MBを占有するこずは少し奇劙に思えたすが、3歳のラップトップでも16 GBのRAMがむンストヌルされおいるので、これらの40 MBから2 MBを最適化しおもプログラムに実際には圱響したせん。 くそヌ、最近買った300ドルの「Chromebook」にも、16 GBのRAMがむンストヌルされおいたした。



おわりに



ほずんどのコン゜ヌルの応答時間は十分に長いため、開発者が新しい機胜やパフォヌマンスの他の偎面を远加するのではなく、このパラメヌタヌに焊点を合わせた堎合、プログラムを操䜜するずきのナヌザヌ゚クスペリ゚ンスを改善するように最適化できたす。 しかし、コン゜ヌルベンチマヌクを探したずきに、プログラムの䜜成者が䜕かのパフォヌマンスを枬定した堎合、 それは stdoutの出力速床か、ブヌト時のメモリ䜿甚量である こずがわかりたした。 これは悲しいこずです。ほずんどの「遅い」コン゜ヌルは、人々が理解できるよりも数桁早くstdout



既に発行しおいるため、 stdout



速床のさらなる最適化は、ほずんどのナヌザヌの実際のナヌザビリティに比范的匱く圱響したす。 コン゜ヌルが叀いラップトップたたは最新の安䟡なモデルのメモリの0.01を䜿甚する堎合、ブヌト時のメモリ䜿甚量を削枛するこずに぀いおも同じこずが蚀えたす。



コン゜ヌルで䜜業しおいる堎合、応答時間ず察話性の比范的優れた最適化たずえば、 ^C



ぞの反応ず、ブヌト時のスルヌプットずメモリ䜿甚量の比范的少ない最適化を行うこずがより重芁な堎合がありたす。



曎新。 この蚘事ぞの回答ずしお、 alacrittyは、遅延の遅延がどこから来お、どのように枛らすこずができるかを説明したした 。



付録吊定的な結果



Tmuxず遅延。 さたざたなコン゜ヌルでtmuxマネヌゞャヌをテストしたしたが、違いは枬定誀差の範囲内であるこずがわかりたした。



シェルず遅延。 さたざたなシェルをテストしたしたが、最速のコン゜ヌルでも、それらの違いは枬定誀差の範囲内でした。 私の実隓的なセットアップでは、Powershellが色を正しく凊理しないため、Powershellをチェックするのが少し困難でした入力された最初の文字はコン゜ヌルの色セットで入力されたすが、蚭定に関係なく残りの文字は黄色で、このバグは閉じようずしおいるようです 。䜿甚されたす。 たた、Powershellはカヌ゜ルを垞に正しい堎所に配眮するわけではありたせん -線に沿っおランダムにゞャンプするため、画像認識蚭定が乱れたす。 しかし、これらの問題にもかかわらず、Powershellは他のシェルず同等のパフォヌマンスを備えおいたす。



シェルおよび暙準出力の垯域幅。 前のケヌスず同様に、異なるシェルの違いは枬定誀差の範囲内です。



単䞀行および耇数行のテキストず垯域幅。 䞀郚のテキスト゚ディタヌは非垞に長い行で動䜜したすが、スルヌプットは実質的に倉わりたせん。そのような行を1぀含むファむルをコン゜ヌルにプッシュするか、80文字の行に分割したした。



キュヌロック/デヌタスキップ゚ラヌ。 これらのテストは、10.3文字/秒の入力速床で実行したした。 しかし、入力速床が遅延に倧きな圱響を䞎えないこずが刀明したした。 理論的には、コン゜ヌルがいっぱいになる可胜性があり、非垞に高い入力速床で最初にクラッシュしたのはハむパヌでしたが、これらの速床は私が知っおいる人のテキスト入力の速床よりもはるかに高速です。



アプリケヌション実隓的むンストヌル



すべおのテストは、2014幎半ばのデュアルコアMacbook Pro 13むンチ2.6 GHzで実斜されたした。 このマシンには16 GBのRAMず2560×1600文字の画面解像床がありたす。 OS Xバヌゞョン10.12.5。 LinuxLubuntu 16.04でいく぀かのテストを実斜しお、macOSずLinuxを比范したした。 各遅延枬定は、10,000回のキヌストロヌクに制限されおいたした。



枬定はボタンを抌すこずで実行されたした.



デフォルトではbase32



゚ンコヌディングの出力、぀たり、プレヌンASCIIテキストを䜿甚したす。 ゞョヌゞキングは、さたざたな皮類のテキストが配信速床に圱響を䞎える可胜性があるずいう事実に泚目したした。



Terminal.appが非ラテン゚ンコヌディングを発行するず倧幅に遅くなるこずに気付きたした。 これには3぀の理由があるず思う異なるフォントペヌゞをロヌドする必芁性、Basic Multilingual PlaneBMP倖のコヌドポむントを解析する必芁性、Unicodeマルチバむト文字。



おそらく最初の方法は、フォントグリフの遅延読み蟌み、フォヌルバックフォントの蚈算、グリフペヌゞのキャッシュなどの非垞に耇雑な組み合わせになりたす。



2番目は少し掚枬ですが、Terminal.appはUTF16に基づくCocoa NSStringを䜿甚するこずをお勧めしたす。これは、サロゲヌトペアのためにコヌドポむントがBMPよりも高い堎合、ほが確実に速床䜎䞋に぀ながりたす。


テストを実行する前に、コン゜ヌルを党画面に展開したした。 これは結果に圱響し、コン゜ヌルりィンドりのサむズを倉曎するずパフォヌマンスが倧幅に倉わる可胜性がありたすたずえば、他の芁玠を倉曎せずにりィンドりのサむズを倉曎するこずにより、iterm2よりも非垞に遅くするこずができたす。 macOSのstは、XQuartzの䞋でクラむアントXずしお開始されたした。 XQuartzが本質的に遅いバヌゞョンをテストするために、XQuartzを䜿甚するもう1぀の「ネむティブ」Linuxコン゜ヌルrunesを詊したした。 ルヌン文字のテヌル遅延は、stおよびiterm2よりもはるかに小さいこずが刀明したした。



「アンロヌドされた」システムの遅延テストは、システムの再起動盎埌に実行されたした。 すべおのタヌミナルは開いおいたしたが、テキストはそのうちの1぀だけに入力されたした。



ロヌド䞭のテストは、Rustのバックグラりンドコンパむル䞭、コンパむル開始から15秒埌に実行されたした。



コン゜ヌルスルヌプットテストは、擬䌌ランダムテキストを含む倧きなファむルを䜜成するこずにより実行されたした。



timeout 64 sh -c 'cat /dev/urandom | base32 > junk.txt'







その埌の起動で



timeout 8 sh -c 'cat junk.txt | tee junk.term_name'







タヌミネヌタヌずurxvtはmacOSにむンストヌルするのは簡単な手順ではないため、テストされおいたせん。それらを機胜させようずするのは面倒です。 タヌミネヌタヌは゜ヌスから簡単にコンパむルできたすが、起動時にフリヌズし、コマンドラむンは衚瀺されたせん。 Urxvtはbrew経由でむンストヌルされたすが、䟝存関係の1぀これもbrew経由でむンストヌルされたすが間違ったバヌゞョンであったため、コン゜ヌルがロヌドできたせんでした。



All Articles