[std.concurrency] prioritySend is 1000 times slower than send?
osa
osa at aso.osa
Wed Sep 29 11:25:07 PDT 2010
I started using std.concurrency in some projects and overall it feels
like a solid (albeit minimalistic) design. However, current
implementation has some issues. For example, I've noticed that using
prioritySend slows everything considerably. Here is a simple benchmark
to demonstrate the problem:
---------
import std.concurrency;
import std.date;
import std.stdio;
struct Message {}
void main() {
enum TIME_LIMIT = 5 * ticksPerSecond;
auto started = getUTCtime();
d_time running = 0;
long iterations = 0;
while( running < TIME_LIMIT ) {
version( priority ) {
prioritySend( thisTid, Message() );
}
else {
send( thisTid, Message() );
}
receive( (Message){} );
if( ++iterations % 100 == 0 ) {
running = getUTCtime() - started;
}
}
auto seconds = cast(double)running / ticksPerSecond;
writeln( "Benchmark: ", iterations, " iterations in ", seconds, "
seconds (", iterations / seconds, "/second)" );
}
---------
Using dmd v2.049 on linux, this produces:
Benchmark: 4469600 iterations in 5 seconds (893920/second)
But when compiled with -version=priority, result is quite different:
Benchmark: 3700 iterations in 5.177 seconds (714.7/second)
This is about 1250 times slower than using send! Is there any reason for
such penalty for using prioritySend?
Note that benchmark code is single-threaded. Initial version was using
two threads (with similar discrepancy between send and prioritySend) but
when I've tried to run it after compiling with -profile, it did not
work. I assume that profiling is not supported for multi-threaded
programs yet? So I profiled single-threaded benchmark and it seems that
the main offender is PriorityMessageException constructor:
Num Tree Func Per
Calls Time Time Call
1700 777986427 777986427 457639 class
std.concurrency.PriorityMessageException!(struct
concur1.Message).PriorityMessageException
std.concurrency.PriorityMessageException!(struct
concur1.Message).PriorityMessageException.__ctor(struct concur1.Message)
P.S. demangle program example at
http://www.digitalmars.com/d/2.0/phobos/std_demangle.html is broken --
it does not compile.
P.P.S. std.demangle fails for some symbols, for example:
_D3std5array13__T5emptyTyaZ5emptyFNdxAyaZb
_D3std6format19__T10FormatSpecTyaZ10FormatSpec6__ctorMFNcxAyaZS3std6format19__T10FormatSpecTyaZ10FormatSpec
and many other.
More information about the Digitalmars-d
mailing list