...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

遅延評価の力

プログラムにおいて,使いもしない値を用意しておくのは時間的にも空間的にも無駄.遅延評価とは,その引数の値が実際に必要になるまで,評価(引数の値を求めるための計算)を後回しにする技術だ.結局使わなかった場合にはまったく評価されず丸儲けとなる.

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]

これならわかりやすいだろう.整理してあっちの入門記事に書こうっと.