01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
2010-02-23 Tue
■ if文の条件内で宣言したい [D言語]
宣言が構造体の変数だとどう書く?
import std.stdio;
struct S
{
int value;
}
void main()
{
if(auto s = S(10)) //Error: expression S(10) of type S does not have a boolean value
{
writeln(s.value);
}
}
こういう書き方ではないようだ。
クラスの場合はどうだろう。
import std.stdio;
class C
{
int value;
this(int value)
{
this.value = value;
}
}
void main()
{
if(auto c = new C(10))
{
writeln(c.value);
}
}
動いた。
構造体を new してみる。
import std.stdio;
struct S
{
int value;
this(int value)
{
this.value = value;
}
}
void main()
{
if(auto s = new S(10))
{
writeln(s.value);
}
}
動いた。
■ D言語で気軽に時間測定がしたい [D言語]
C++ で気軽に時間測定がしたい
D言語で書いてみる。
クラスで書いてみた。
import std.stdio;
import std.format;
import std.utf;
import std.perf;
scope class Benchmark(T=PerformanceCounter)
{
alias T.interval_t interval_t;
T timer;
char[] msg;
this(...)
{
void putc(dchar c)
{
std.utf.encode(msg, c);
}
std.format.doFormat(&putc, _arguments, _argptr);
timer = new T;
timer.start;
}
~this()
{
timer.stop;
interval_t elapsedMsec = timer.milliseconds;
stderr.writefln("%s: %s msec", msg, elapsedMsec);
}
}
スコープ変数にしてデストラクタが動くようにする。
void main()
{
{
int i = 10_000_000
scope benchmark = Benchmark!()("sleep(%d)",i);
Thread.sleep(i);
}
}
sleep(10000000): 1000 msec
構造体で書いてみる。
import std.stdio;
import std.format;
import std.utf;
import std.perf;
struct Benchmark(T=PerformanceCounter)
{
alias T.interval_t interval_t;
T timer;
char[] msg;
this(...)
{
void putc(dchar c)
{
std.utf.encode(msg, c);
}
std.format.doFormat(&putc, _arguments, _argptr);
timer = new T;
timer.start;
}
~this()
{
timer.stop;
interval_t elapsedMsec = timer.milliseconds;
stderr.writefln("%s: %s msec", msg, elapsedMsec);
}
}
void main()
{
{
int i = 10_000_000
auto benchmark = Benchmark!()("sleep(%d)",i);
Thread.sleep(i);
}
}
sleep(10000000): 1000 msec
これだと入れ子のたびに名前をつけなくてはいけない。
だから if 文の条件中に宣言しているのか?
結構難しい。
delegate を使って書いてみる。
import std.stdio;
import std.format;
import std.utf;
import std.perf;
void benchmark(T=PerformanceCounter)(void delegate() dg,...)
{
alias T.interval_t interval_t;
T timer = new T;
char[] msg;
void putc(dchar c)
{
std.utf.encode(msg, c);
}
std.format.doFormat(&putc, _arguments, _argptr);
timer.start;
dg();
timer.stop;
interval_t elapsedMsec = timer.milliseconds;
stderr.writefln("%s: %s msec", msg, elapsedMsec);
}
void main()
{
for(int i = 0; i <= 3; i++) {
benchmark({
Thread.sleep( i * 10_000_000 );
},"sleep(%d)", i * 10_000_000 );
}
}
sleep(0): 11 msec sleep(10000000): 999 msec sleep(20000000): 2004 msec sleep(30000000): 3002 msec
けっこうそれっぽい?