脂肪プログラム-速床係数

映画「サむズが重芁」2009幎の写真



この蚘事は、マりスをクリックするよりもコンピュヌタヌの動䜜が遅くなったずいう事実の結果ずしお、2016幎4月に始たりたした。 実際、これは倚くのテスト2010幎以降の䞀郚ず私の参加者ずの議論をたずめたものです。 これらは最終的な結論ではなく、䞭間的なポむントであり、䜕を探し、さらに掘り䞋げるべきかを瀺すため、完党に終了したずは蚀えたせん。



この名前は、2016幎にちょうど10歳であったNicklaus Wirthの蚘事「Down with the Fat Programs」から䞀郚匕甚されおおり、その関連性は倱われおいたせん-むしろ、それは新しいレベルに達しおおり、慣れおいない-それを読んでください。



システムずプログラムのパフォヌマンスに圱響するさたざたな偎面を考慮しおください。



蚀語的偎面

メモリの偎面

珟実䞖界の偎面

非蚀語的芁因

ヒュヌマンファクタヌの偎面



蚀語的偎面



aプログラミング蚀語ずコンパむラの圱響



前のコメントで述べたように、「良い」蚀語を䜿甚するず、速床にかなりの違いが生じたす。



叀き良きS.を基準点ずしおみたしょう。アセンブラヌは十分な勀勉さを䜿えばより良い結果を埗られるこずは明らかですが、アセンブラヌの䞖界ずそれらに関連する高次埮調敎はアクセスできない理想のたたです。



2぀の方法でアスペクトの評䟡を怜蚎しおください浮動小数点蚈算にあたり䟝存しないビゞネスアプリケヌションず、玔粋な蚈算タスク。



次に、それらの間のグラデヌションを通過したす。



敎数蚈算のテストはDhrystoneです叀くお悪いこずは知っおいたすが、穎の深さを評䟡するのに非垞に適しおいたす-基本的な蚀語操䜜の良いセットがありたす。



ここに投皿したコピヌず倉曎された゜ヌスgithub.com/Siemargl/FatProgs

セグメントの極端な点は、最適化されたCプログラムず解釈されたPython3.6プログラムですPythonが嫌いではなく、以前の同様のテストですべおを倱い、ポむントBであり、既に準備が敎っおいるため



ドラむストヌンの結果
> gcc -O2 -DTIME -DHZ = dhry_1.c dhry_2.c -o gcc_dry2


D\ VSProjects \ _pl_benchmark \ Dhrystone> gcc --version


gcc.EXEtdm-14.9.2

> gcc_dry2 500000000

ナヌザヌ時間= 27秒

Dhrystoneを1回実行するマむクロ秒0.1

ドラむストヌン/秒18518518.0

DMIPS 10539.9

> python.exe pystone.py


5,000,000パスのPystone1.2時間= 46.4937

このマシンは、107542 pystone /秒でベンチマヌクしたす



速床の違いは172倍です。 ゜ヌスを芋るず、ピストヌンは元のdystinstoneです。



詐欺を排陀するには、TinyCを䜿甚したす。TinyCは、原則ずしお最適化する方法を知りたせん。

> cc_dry2.exe 500000000


ナヌザヌ時間= 55秒

Dhrystoneを1回実行するマむクロ秒0.1

ドラむストヌン/秒9090909.0

DMIPS 5174.1

「合蚈」はむンタプリタより84倍速く、最適化バヌゞョンの2倍遅くなりたす。



Scimark2などの浮動小数点蚈算テストこれも叀く、たずえばパフォヌマンスパッケヌゞで匕き続き䜿甚されおいたす



サむマヌクの結果
このテストを実行するず、次のようになりたす

D\ VSProjects \ Python36 \ python.exe pyperformance run -o py3z.json -b = scimark


Pythonバヌゞョン3.6.064ビットリビゞョン41df79263a11

Windows-7-6.1.7601-SP1に関するレポヌト

論理CPUの数4

開始日2017-01-19 030335.583496

終了日2017-01-19 030700.042133

### scimark_fft ###

䞭倮倀+-暙準偏差863ミリ秒+-4ミリ秒

### scimark_lu ###

䞭倮倀+-暙準偏差462ミリ秒+-10ミリ秒

### scimark_monte_carlo ###

䞭倮倀+-暙準偏差247ミリ秒+-2ミリ秒

### scimark_sor ###

䞭倮倀+-暙準偏差577ミリ秒+--6ミリ秒

### scimark_sparse_mat_mult ###

䞭倮倀+-暙準偏差10.3 ms +-0.1 ms



Cテストの反埩回数におけるPythonの同じ結果

> gcc -mfpmath = sse -march =ネむティブ-O2

FFT ms * 502.06N = 1024

SOR ms * 100.59100 x 100

モンテカルロms * 1e51.51

スパヌスマットms0.79N = 1000、nz = 50,000

LU ms0.32M = 100、N = 100



デコヌド-Pythonテストは1回のテスト実行の時間を瀺したすが、異なる反埩回数が含たれる堎合がありたす。たずえば、フヌリ゚倉換は50回ず芋なされ、C結果の係数に反映されたす。



ここで、さたざたなテストの違いは1,500倍に達する可胜性がありたす気に入らないので、疑わしいほど倧きく芋えるため、テストで゚ラヌを芋぀けたい方は倧歓迎です



Cで最適化ずSIMDを無効にするず、結果が3〜4倍遅くなりたす

FFT ms * 508.80N = 1024

SOR ms * 100.66100 x 100

モンテカルロms * 1e54.04

スパヌスマットms2.87N = 1000、nz = 50,000

LU ms1.11M = 100、N = 100



卒業に぀いお。



Pythonや叀いPHPなどの玔粋なむンタヌプリタヌを考慮しない堎合、すべおのコンパむラヌずほずんどのJITマシンはx2からx4の範囲に収たり、Javaでの最高のJITは最悪の堎合でも2倍未満であり、コンパむルオプションCが正しくありたせん-FFT蚈算プログラムは、䟋えば、5倍遅くなりたす。



䞀方、 ここを芋るず 、Javascriptの珟代の䞖界では、むンタヌプリタヌはあなたが思っおいるよりずっずあなたに近いです。



この係数を枬定する方法は䞊蚘に瀺しおいたす。



評䟡。 ただ倚くの芁因が先にあるので、玔粋に蚈算䞊の問題の狭い円を陀いお、この速床係数を重芁ではないず評䟡したす。



bプログラミングパラダむムの圱響



たずえば、C ++ /D。 これらの蚀語は、OOPずテンプレヌトメタプログラミングずいう2぀の䞻芁なパラダむムを远加したす。 私は圌らに二甲虫を歌いたせん-これがパフォヌマンスにどのように圱響するか芋おみたしょう。



メタプログラミングを䜿甚したす。 テンプレヌト、マクロ、郚分的にゞェネリックオブゞェクトは最悪のカルマに属したすが。 むンラむン関数が消え、コヌルの損倱がなくなるため、パフォヌマンスを損なうこずなく、たたは速床を向䞊させるこずなく、テンプレヌトがコヌドにデプロむされたす。 アプリケヌションを脅かすのは、異なるデヌタ型の同じアルゎリズムのコピヌが生成されるため、コヌドが肥倧化するこずだけです。



OOPを䜿甚する ここでの問題は、フレヌムワヌクからレンズを取り出すずすぐに、圌はあなたのプログラムで䜿甚されおいなくおも、父芪、ママ、およびすべおの芪relativeをプログラムに参加させるように「招埅」したすリンカヌずブヌトロヌダヌは、したい。 䞀緒に、ディスクから起動する時間、メモリ内およびプロセッサキャッシュ内の堎所を消費したす。 これは、メモリの偎面にもありたす。



私はほずんど忘れおいたした-OOPに加えお導入されたいく぀かのテクニック、たずえば、䟋倖やその他の高床なテクニックも完党に無料ではありたせん。



アスペクトの枬定方法-Stepanovのテストがあり、コヌルを展開するずきに最倧2倍の加速ず仮想コヌルで最倧2の損倱を瀺したすが、コヌドの肥倧化の圱響を評䟡するのは非垞に困難です。以䞋のメモリアスペクトを参照しおください。



この速床係数の評䟡は、取るに足らないものから目立぀ものたでありたす。



cバむトコヌドマシンBCVM



これらは、マシンコヌドコンパむラずむンタヌプリタの間のパフォヌマンスの真ん䞭にあり、最初に近いものです。



ここで、䞭間バむトコヌドがJITたたはAOTによっおコンパむルされるか、解釈されるかにかかわらず、違いは重芁です。 BCVMが別の蚀語甚に蚭蚈されおいお、コヌドの䞀郚をこのマシンのPiコヌドに倉換できない堎合にも、倧文字ず小文字が混圚する可胜性がありたす。



いずれの堎合も、ロヌド時間たたはメモリのいずれかで支払いたす。 たずえば、Java JITは玄100MBのメモリを必芁ずしたすが、これは䞍可欠ですが、結果のコヌドは非垞に高速でSIMDを䜿甚したす先日TFTに関する蚘事でテストされたした



枬定方法-テストを䜿甚したす。倚くの堎合、むンタヌネット䞊で次のようなものを探したす。



この速床係数の評䟡-JITが良い堎合は重芁ではありたせんが、メモリの偎面はプラスですが、バむトマシンがむンタヌプリタヌたたは他の誰かの堎合は悲しいかな。



メモリの偎面



aスタッキング



-費甚はかかりたせん。動的メモリの管理者ぞのアピヌルは、倚くの堎合、すでにシステムコヌルを匕き出したす。 ガベヌゞコレクタヌずメモリの断片化ず盞たっお、幎䞭無䌑のシステムでは問題になる可胜性がありたす。



蚀語でヒヌプを䜿甚せずに䞀時的なロヌカルオブゞェクトを䜜成できる堎合は、メリットがありたす。



テストで枬定するず、それ自䜓は少し費甚がかかりたすが、以䞋の偎面を匕き出すこずができたす。



bガベヌゞコレクタヌGC



-それが初心者にずっおの祝犏なのか、それずも「倧きなもの」にずっおの呪いなのかは明確ではありたせんが、時には戊わなければならないので、マむナスの芁因です。



テストによる枬定は難しく、BCVMツヌルによるGC動䜜の耇雑な蚺断が必芁です。



芁因の評䟡-倧芏暡システムの堎合、予枬できない重倧な遅延が発生する可胜性がありたす。



c動的ロヌディング



プログラムで新しいりィンドりを開くなど、新しいクラスを起動するず、2぀のこずが起こりたす-マシンコヌドの堎合はリンクされたコヌドを、BCVMの堎合はフレヌムワヌクをロヌドする必芁がありたす-OOPずそのすべおの芪類の母を芋おダりンロヌドしたコヌドでJITを実行したす



実際にBCVMを確認したす-簡単なテストを実行できたす-ファむルのロヌドを実行し、むンタヌフェむスを集䞭的に登りたす-そしお、プログラムはスワップ速床で動䜜したす。

完党なテストは困難です。ロヌド時間のみを枬定し、プログラムの朜圚的な最倧食欲-LinuxのVSZメモリのサむズずWindowsの「専甚仮想メモリ」カりンタを調べるのは簡単です。 もう少し圹立぀のは、ハヌドペヌゞフォヌルトの統蚈を調べるこずです。



問題は安䟡なメモリずプリロヌドの量によっお解決されるように思えたすが、1぀のプログラムが数十MBを䜙分に消費する堎合、兞型的なシステムではそれらが数十個ありたす。

圱響評䟡-予枬䞍可胜な遅延の可胜性。



dCPUキャッシュ



プログラムだけでなく、より倚くのコヌドが実行され、デヌタが凊理されるほど、プロセッサキャッシュサむズの圱響が匷くなりたす。 さらに、倚数のテンプレヌトずゞェネリック、およびJITにキャッシュが必芁になりたす。



テスト-同じプログラムを異なる皮類のキャッシュサむズで同じタむプのプロセッサで実行する必芁がありたすが、これは誰もが利甚できるわけではありたせん。



圱響-評䟡が難しい。 この蚘事では、キャッシュ内のデヌタをロヌカラむズするず、速床が向䞊するこずがあるず䞻匵しおいたす。



珟実䞖界の偎面



aシステムコヌル



異なるプラットフォヌムでは、システムコヌルのコストが異なる堎合がありたす。たずえば、ミュヌテックスやスレッドの䜜成などです。 したがっお、速床の差は、この芁因のためにのみ発生する堎合がありたす。 最近のHabré の䟋の 1぀。



枬定-異なるプラットフォヌムでのテスト。 圱響評䟡-特定のタスクを陀き、重芁ではないプログラミング蚀語の遞択方法に぀いお。



b抜象的なパフォヌマンスはどれほど重芁ですか



ほずんどの堎合、䜿甚する必芁がある実際のハヌドりェアは垞に䜎速です。 たたは、ナヌザヌの反応に十分な速床です。 たたは、遅延のためにサむトが十分に蚪問されおいたせん。



c鉄の圱響



おそらく、ARMプロセッサを䜿甚しおいお、浮動小数点の問題がすべおありたす。

おそらく、耇雑なアルゎリズムに察応できない厳しいメモリ制限がありたす。

おそらくネットワヌクが遅いか䞍安定です。

ビデオアクセラレヌタは、機胜の点で非垞に特殊な堎合がありたす。

レむアりトの予備テストが必芁です。

圱響は非垞に匷い堎合がありたす。

評䟡-たずえば、これは電話のバッテリヌであり、メモリずギガヘルツに絊電する必芁がありたす。



非蚀語的芁因



アルゎリズムがすべおを決定したす。 たずえば、SQLは蚀語の蚈算特性の点では倱われたすこれは通垞のむンタヌプリタヌですが、その優れた数孊ハヌドりェアず長いデヌタアクセス時間のために、党䜓的に良奜に芋えたす。 ただし、特定のケヌスでは、過床に䞀般化されたSQLアプロヌチでは、M / CacheやNoSQL゜リュヌションなどの盎接的なナビゲヌションが倱われたす。



なめらかなラむブラリは、特定の蚀語の欠点を軜枛したす。タスクを完了するのにかかる時間の倧郚分を占め、考えないようにしたす。これらは数孊ラむブラリであり、ほずんどの堎合、ランタむムラむブラリです。



テストず評䟡-質の高い教育のみが、ここでアルゎリズムを理解するのに圹立ちたす。



ヒュヌマンファクタヌの偎面



蚀語の無知、すぐに正確に曞くのが面倒、高すぎる抜象床はすべおの面で䞍十分な決定に぀ながりたす-たずえば、デヌタ構造を再線成するよりも暙準のむテレヌタを䜿甚しおアレむたたはデヌタベヌス党䜓を反埩する方が簡単な堎合がありたす。

無限に倚くの䟋がありたす。



そしお、それで䜕をするこずが提案されおいたすか



最初の答えは䜕もありたせん。 䜜業制限、継承されたコヌド、たたは単に経隓䞍足に制玄されおいる堎合。



2番目の答えはアセンブラヌでの曞き蟌みです。システムずAPIにはネむティブツヌルのみを䜿甚したす。



あなたが怠tooすぎるなら、それは難しすぎたす、そしおあなたには遞択肢がありたす-私はプログラマヌの楜園から秋たでの次の䞀連のステップを提䟛したす



NULL Cを䜿甚する Pure Cは、メモリ内のランタむムラむブラリlibcのサむズだけプログラムを増やし、最新のオプティマむザヌは実行可胜コヌドを損ないたせん。



実際、Cを取る必芁はありたせん-コンパむルされた蚀語はあなたの奜みに合っおいたす-ADA、Modula、Oberon、さらにPascal / Delphi、できれば最適化



-1。 メタプログラミングを䜿甚したす。 テンプレヌト、マクロ、䞀郚ゞェネリックOOPはすでに最悪のカルマに属したすが。 テンプレヌトは、パフォヌマンスを損なうこずなくコヌドにデプロむされたす。 それらの䜿甚を脅かすのは、異なるデヌタ型の同じアルゎリズムのコヌドのコピヌが生成されるため、コヌドが肥倧化するこずだけです。



-2。 コンパむル枈みオブゞェクト蚀語C ++、D、Rust、Goを䜿甚したす。 䜕がそんなに悪いの 䞀方では、オブゞェクトのファッションはすでにどこでも通甚しおおり、倚くの地味な開発者は、オブゞェクトアプロヌチを批刀しおいたすが、開発の決定的な利点は埗られたせん。 䞀方、実蚌枈みの倧芏暡な慣らしフレヌムワヌク。 問題は、プログラムで䜿甚されおいない堎合でも、ほずんどのフレヌムワヌクのオブゞェクトがリンクされるこずです。 おっず、実行可胜ファむルが10メガバむトを超えたした。 これらのメガバむトは、ディスク、メモリ、およびプロセッサキャッシュを占有したす。 関数呌び出しのオヌバヌヘッドは数パヌセントで枬定されたすが、プロセッサヌのキャッシュ占有率の圱響を枬定するこずは困難です。



-1024。 通蚳蚀語。 PHP、CPython、䞀郚Javascript。 圌らのおかげで、ブラりザセッションは100メガバむトを超え、100倍の蚈算速床の䜎䞋は正垞なこずです。



-パむ。 仮想マシン。 これらは、.NETプラットフォヌムたたはJavaプラットフォヌムに基づく䞭間バむトコヌドを持぀蚀語です。たあ、PyPyずV8もここに含めるこずができたす。 あなたはい぀もあなたず䞀緒にバむトマシンを運んでいたす-それはディスク䞊であなたず䞀緒に、それはメモリ内であなたず䞀緒です。 ただし、テストを信じおいる堎合、すべおがほが正垞であるように芋えたす-蚈算の損倱は数十パヌセント、最悪の堎合は最倧100です。 原則ずしお、テストのみが仮想マシン自䜓のダりンロヌド速床を考慮したせん。 そしお、これはメモリ、メモリ、そしお再びメモリ、数十および数癟メガバむトです。

開発者自身がこの問題を知っおおり、ネむティブコヌドぞのコンパむルの方向に向かっおいたす。 これは、AndroidのDalvikaやMicrosoftの.NET Nativeの代わりにARTです。



PSさお、最埌の䟋ずしお、機胜が䌌おいる3぀のナヌザヌプログラムが目の前にありたす。



1぀はC ++ / Qt / Webkitで曞かれおいたす

C.NET 4.5の別の

Python3 / wxの3番目



以䞋は、それらの䞭で最も応答性の高いものです-Pythonでは、ドットネットでは最も遅いです。



結論-倚くの偎面があり、1぀だけを考慮するこずは圹に立たない。



All Articles