ToDo:
Google CPU Profilerによる測定結果
Total: 68153 samples 22354 32.8% 32.8% 22354 32.8% tdrift_ 4828 7.1% 39.9% 4828 7.1% tquad_ 4801 7.0% 46.9% 4801 7.0% tsteer_ 4315 6.3% 53.3% 4315 6.3% ttfrin_ 4228 6.2% 59.5% 4228 6.2% tsolqu_ 4011 5.9% 65.3% 4011 5.9% tmulti_ 2267 3.3% 68.7% 2267 3.3% tbend_ 1745 2.6% 71.2% 1749 2.6% tturn1_ 1353 2.0% 73.2% 1353 2.0% fintrb_ 831 1.2% 74.4% 831 1.2% tmulbs_ 766 1.1% 75.6% 766 1.1% tthin_ 729 1.1% 76.6% 729 1.1% 0x000000020112dee6 679 1.0% 77.6% 679 1.0% xsin_ 635 0.9% 78.6% 635 0.9% touckf_ 595 0.9% 79.4% 595 0.9% spdrift_ 500 0.7% 80.2% 500 0.7% tsfrin_ 395 0.6% 80.7% 395 0.6% tmultr5_ 303 0.4% 81.2% 303 0.4% spkick_ 302 0.4% 81.6% 302 0.4% tbende_ 287 0.4% 82.1% 287 0.4% bint_ 256 0.4% 82.4% 256 0.4% tintrb_ 238 0.3% 82.8% 238 0.3% 0x000000020112c1fc 197 0.3% 83.1% 197 0.3% tsteee_ 168 0.2% 83.3% 168 0.2% tcav_ 153 0.2% 83.5% 1307 1.9% _init 140 0.2% 83.7% 140 0.2% ttfrins_
tdrift(ドリフトスペース)がCPU時間の1/3を占めている
afsad1上で 2010/5/31一日分をSAD形式で読み出してみた。(ストア先は、NFSな home directory)
Group | real | user | sys | size(MiB) |
---|---|---|---|---|
BM/BCM | 6.26 | 5.29 | 0.38 | 198 |
BM/BLM | 71.77 | 64.33 | 4.21 | 2012 |
BM/BMOthers | 6.15 | 5.57 | 0.40 | 201 |
BM/BPMHER | 40.65 | 36.01 | 3.14 | 1580 |
BM/BPMLER | 42.66 | 36.90 | 3.39 | 1602 |
BM/BPMVol | 89.24 | 80.04 | 5.03 | 2482 |
BM/DCCT | 2.71 | 2.40 | 0.16 | 90 |
BM/OctoPos | 2.28 | 1.99 | 0.20 | 86 |
BM/SRM | 180.12 | 160.39 | 11.55 | 5024 |
BT/BTBPM | 3.14 | 2.51 | 0.26 | 108 |
BT/BTMagnets | 4.72 | 3.74 | 0.34 | 138 |
BT/CC | 0.53 | 0.48 | 0.03 | 18 |
CO/Abort | 0.02 | 0.00 | 0.00 | 1 |
CO/Env | 8.03 | 6.55 | 0.61 | 255 |
FB/FBTemp | 1.89 | 1.57 | 0.09 | 53 |
FB/Tune | 2.67 | 2.30 | 0.08 | 82 |
LI/Linac | 0.01 | 0.00 | 0.00 | 0 |
LI/LinacBM | 0.11 | 0.10 | 0.00 | 0 |
LI/LinacMG | 4.59 | 3.56 | 0.37 | 145 |
LI/LinacMisc | 1.76 | 1.44 | 0.19 | 65 |
LI/LinacRF | 6.96 | 5.73 | 0.53 | 207 |
LI/LinacRT | 12.64 | 9.41 | 0.92 | 409 |
LI/LinacVA | 3.93 | 2.59 | 0.36 | 112 |
MG/HERMagnets | 19.81 | 13.08 | 1.14 | 485 |
MG/LERMagnets | 22.53 | 15.69 | 1.30 | 538 |
MG/LERSMagnets | 11.26 | 7.97 | 1.02 | 315 |
MG/MGOthers | 6.88 | 4.89 | 0.56 | 191 |
Misc/Base | 0.72 | 0.62 | 0.06 | 21 |
Misc/KCG | 0.51 | 0.43 | 0.02 | 16 |
Misc/Misc | 42.31 | 28.94 | 4.06 | 1215 |
PY/Physics | 1.52 | 1.31 | 0.07 | 44 |
RF/AnalogData | 86.28 | 62.85 | 5.73 | 2284 |
RF/BinaryData | 0.45 | 0.29 | 0.02 | 8 |
RF/RFOthers | 0.30 | 0.24 | 0.02 | 8 |
VA/CCG | 21.16 | 15.02 | 1.37 | 666 |
VA/IPump | 3.74 | 3.01 | 0.28 | 123 |
VA/Mask | 1.06 | 0.91 | 0.07 | 31 |
VA/VAFlow | 11.64 | 8.63 | 0.64 | 355 |
VA/VAOthers | 1.14 | 0.90 | 0.08 | 31 |
VA/VATemp | 28.70 | 20.36 | 2.01 | 877 |
SAD形式(SAD EPOCHな時刻タグ+レコード名+データ列)だと格納効率はかなり 低く、5月31日分だけで22GiBの領域を必要とする
SADでは、構文解析時に引数が確定している関数言語的な意味で 純粋な組み込み関数に関しては、構文解析時に評価してしまうという という仕様である。たとえば、
In[1]:= Hold[Plus[1, 1]] Out[1]:= Hold[2]
のように評価される。
このルールの元では、Slot演算子に対しても中身は確定していないが 1個の Atomであることは確定しているものとして扱うので、 組み込み関数Lengthの引数となるリストの要素として現れたときに 実引数と結合可能かどうかを問わずに評価されてしまう。
しかし、Slot演算子では、 純粋な関数を字句的に展開した式と展開前の式の評価値が異なる
f = {#1, #2, #3, #4}&; g = Length[#]&; fg0 = g[f[##]]&; fg1 = Length[{#1, #2, #3, #4}]&; Print["fg0 -> ", fg0[1,2]]; ???General::slot: Undefined Slot #3 in ({#,#2,#3,#4}&)[1,2] ???General::abort: Aborted: Print["fg0 -> ", fg0[1,2]] ^ ???-FFS-Error-?Undefined command or element: PRINT["fg0 Print["fg1 -> ", fg1[1,2]]; fg1 -> 4
のような例題が存在できる。 この例では、実行時に純関数(Function)を実引数と結合する際に 仮引数と数が釣り合わない例外が発生しなくなっている。
上記の例題では、例外が発生しているので、評価結果の唯一性が保証 されなくともよいという考え方があるが、次のUnevaluatedを用いた例題では Nullを頭部とする未評価のS式を送り込むという正常系の動作である。
f = {#1}&; g = Length[#]&; fg0 = g[f[##]]&; fg1 = Length[{#1}]&; Print["fg0 -> ", fg0[Unevaluated$[Unevaluated$[Null[a, b, c]]]]]; fg0 -> 3 Print["fg1 -> ", fg1[Unevaluated$[Unevaluated$[Null[a, b, c]]]]]; fg1 -> 1
以上の考察から、Slot演算子が1個の確定したAtomであるとして評価を最適化 するのは結構邪悪な実装だと思われる。
算術IF文は廃止予定に入っているのは知っていたが、代替となる テーブルジャンプ構文を知らなかったのだが、所謂 switch case構文が Fortran90から入っているらしい。
select case(v) case(pattern) statements case(pattern) statements case default statements end select pattern <- pattern_atom , pattern / pattern_atom pattern_atom <- literal:literal / literal: / :literal / literal
Cのswitch構文と比べると各caseをfall throughしない辺りが大きな違いで、 その代わりcase文に複数の適合が記述出来るようになっている
カテゴリー: Admin | Emacs | EPICS | Fortran | FreeBSD | GCC | hgsubversion | IPv6 | KEKB | LHC | Lisp | LLVM | MADX | Ryzen | SAD | samba | tDiary | unix | WWW | YaSAI | お仕事 | イベント | 出張 | 宴会 | 数学 | 艦これ | 買いもの | 追記 | 雑記