Hello,

I'm a complete newbie in D and trying to compare with Java. I
implemented  a simple test for measuring the throughput in message
passing between threads. I see that Java can pass about 4mil
messages/sec while D only achieves 1mil/sec. I thought that D should
be faster.

The messages are simply integers (which are converted to Integer in Java).

The two programs are attached. I tried compiling the D version with
both dmd and gdc and various optimization flags.

mache
import std.concurrency, std.stdio;
import std.datetime;

const n=100000000;
void main() {
    auto tid=spawn(&receiver);
    setMaxMailboxSize(tid, 1000, OnCrowding.block);
    tid.send(thisTid);
    foreach(i; 0..n) {
       tid.send(i); 
    }
    writeln("finished sending");
    auto s=receiveOnly!(string)();
    writeln("received ", s);
}

void receiver() {
   auto mainTid=receiveOnly!(Tid)();
   StopWatch sw;
   sw.start();  
   long s;
   for(auto i=0;i<n;i++) {
      auto msg = receiveOnly!(int)();
      s+=msg;
      //writeln("received ", msg);
   }
   sw.stop();
   writeln("finished receiving");
   writefln("received %d messages in %d msec sum=%d speed=%d msg/sec", n, sw.peek().msecs, s, n*1000L/sw.peek().msecs);
   mainTid.send("finished");
}
package inutil.local;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class ThroughputMpTest {
    static   long n=10000000;

    static BlockingQueue<Integer> queue=new ArrayBlockingQueue<Integer>(1000);
    static class Consumer implements Runnable {
        @Override
        public void run() {
            long s=0;
            try { 
                long t0=System.currentTimeMillis();
                for(int i=0;i<n;i++) {
                    int x=queue.take();
                    s+=x;
                }
                long t1=System.currentTimeMillis();
                double d=t1-t0;
                System.out.println(n+" messages received in "+d+" ms, sum="+s+" speed: "+1000*d/n+" microsec/message, "+1000*n/d+" messages/sec");
            } catch (Exception e){
                e.printStackTrace();
            }
        }
    }

    static class Producer implements Runnable {
        @Override
        public void run() {
            try {
                for(int i=0;i<n;i++) {
                    queue.put(i);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }

    public static void main(String[] args) throws InterruptedException {
        Thread t=new Thread(new Consumer());
        t.start();
        (new Thread(new Producer())).start();
        t.join();
    }
}

Reply via email to