On Friday, 1 March 2013 at 21:52:13 UTC, bearophile wrote:
cvk012c:

I think that similar Perl and Java scripts will outperform D easily.
Thanks Andrei and simendsjo for a quick response though.

Why don't you write a Java version? It takes only few minutes, and you will have one more data point.


You are right. Why not. But instead of using Java split() method I used combination of indexOf() and substring() methods to do the same job. The reason: Java split method implemented as a regular expression which will be unfair to compare to D splitter. Again, I created a similar D version of the script, compiled it with all suggested options: -release -O -inline -noboundscheck and this time D version is more then twice slower than Java: 8.4 seconds vs 4. D experts, please, take a look at my code and tell me what is wrong with it.

Java version:

public class Test
{
  public static void main(String[] args)
  {
String message = "REGISTER sip:comm.example.com SIP/2.0\r\nContent-Length: 0\r\nContact: <sip:12345@10.1.3.114:59788;transport=tls>;expires=4294967295;events=\"message-summary\";q=0.9\r\nTo: <sip:12...@comm.example.com>\r\nUser-Agent: (\"VENDOR=MyCompany\" \"My User Agent\")\r\nMax-Forwards: 70\r\nCSeq: 1 REGISTER\r\nVia: SIP/2.0/TLS 10.1.3.114:59788;branch=z9hG4bK2910497772630690\r\nCall-ID: 2910497622026445\r\nFrom: <sip:12...@comm.example.com>;tag=2910497618150713\r\n\r\n";
    long t1 = System.currentTimeMillis();
    for (int i=0; i<10000000; i++)
    {
      int index1 = 0;
      while (true)
      {
        int index2 = message.indexOf("\r\n", index1);
        if (index2 == -1)
          break;
        String notused = message.substring(index1, index2);
        index1 = index2+2;
      }
    }
    System.out.println(System.currentTimeMillis()-t1);
  }
}



D version:

import std.stdio,std.string,std.datetime;

void main()
{
auto message = "REGISTER sip:example.com SIP/2.0\r\nContent-Length: 0\r\nContact: <sip:12345@10.1.3.114:59788;transport=tls>;expires=4294967295;events=\"message-summary\";q=0.9\r\nTo: <sip:12...@comm.example.com>\r\nUser-Agent: (\"VENDOR=MyCompany\" \"My User Agent\")\r\nMax-Forwards: 70\r\nCSeq: 1 REGISTER\r\nVia: SIP/2.0/TLS 10.1.3.114:59788;branch=z9hG4bK2910497772630690\r\nCall-ID: 2910497622026445\r\nFrom: <sip:12...@comm.example.com>;tag=2910497618150713\r\n\r\n";
  auto t1 = Clock.currTime();
  for (int i=0; i<10000000; i++)
  {
    auto substring = message;
    while (true)
    {
      auto index = indexOf(substring, "\r\n");
      if (index == -1)
        break;
      auto notused = substring[0..index];
      substring = substring[index+2..$];
    }
  }
  writeln(Clock.currTime()-t1);
}

Reply via email to