遅延評価の力
プログラムにおいて,使いもしない値を用意しておくのは時間的にも空間的にも無駄.遅延評価とは,その引数の値が実際に必要になるまで,評価(引数の値を求めるための計算)を後回しにする技術だ.結局使わなかった場合にはまったく評価されず丸儲けとなる.
D言語は,関数の引数を遅延評価させることができる.遅延評価をうまく使うとどれくらい実行時間に差がでるのか,極端なコードを書いて実際にやってみた.
import std.c.time; import std.stdio; void main(char[][] args) { clock_t t1, t2; // 普通の関数 t1 = clock(); for(int i = 0; i<100000000; i++) normal(text, i); t2 = clock(); writefln("normal: ", (t2-t1)/CLOCKS_PER_SEC, "[sec]"); // 引数を遅延評価する関数 t1 = clock(); for(int i = 0; i<100000000; i++) lazyEval(text, i); t2 = clock(); writefln("lazy: ", (t2-t1)/CLOCKS_PER_SEC, "[sec]"); } // 普通の関数 void normal(char[] s, int i) { if (i % 1000000 == 0) writef(s); } // 引数を遅延評価する関数 void lazyEval(lazy char[] s, int i) { if (i % 1000000 == 0) writef(s); } // 実際に必要になるまで遅延評価される関数 char[] text() { char[] ret; for(int i = 0; i<10; i++) ret ~= "A"; ret = ""; return ret; }
実行結果:
C:\temp>main normal: 65[sec] lazy: 3[sec]
これならわかりやすいだろう.整理してあっちの入門記事に書こうっと.