ファンクタとD言語とdmd
Effective STLを読んで,ファンクタの方が速いよ!みたいな記述があったのでD言語で試してみたら,なんか普通に遅かった.そもそもクロージャとかリテラルで書けるD言語にはファンクタなんかいらないというわけですよ!
以下ソース.
import std.stdio, std.date; void for_each(T, F)(ref T[] lhs, ref T[] rhs, F func) { foreach (e; lhs) rhs ~= func(e); } struct Plus(int num) { int opCall(int v) { return v + num; } } int plus(int num)(int v) { return v + num; } void main() { enum N = 10000; void test1() { int[] a = [1, 2, 3], b; foreach (i; 0..N) for_each(a, b, &plus!10); delete b; } void test2() { Plus!(10) p; int[] a = [1, 2, 3], b; foreach (i; 0..N) for_each(a, b, p); delete b; } void test3() { int[] a = [1, 2, 3], b; foreach (i; 0..N) for_each(a, b, (int v) { return v + 10; }); delete b; } //auto r = benchmark!(test1)(1000); //auto r = benchmark!(test2)(1000); //auto r = benchmark!(test3)(1000); //writeln(r); }
test2のファンクタでpを直接渡してないのは,そういうコードが書けないから.これからもD言語にはファンクタなんかいらないことがわかる(違