Asynchronous Programming and Eventhandling in D

Eugene Wissner via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Jul 6 11:18:46 PDT 2016


On Wednesday, 6 July 2016 at 14:57:08 UTC, chmike wrote:
> On Wednesday, 6 July 2016 at 11:33:53 UTC, Eugene Wissner wrote:
>>
>> The only reason libev was choosen is that it is the simplest 
>> implementation I know about. A few C files. I had an 
>> educational purpose: I wanted to see how an event loop works 
>> on low level. Asyncio was for me no-go, since I've not written 
>> a lot in C++, and can only read the code a bit. So I'm not 
>> hanging on libev. The only another implementation would be the 
>> python event library. It is also pure C code and it was much 
>> more cleaner written than libev on the first sight.
>
> Your project and work is valuable on many aspects. I didn't 
> mean to depreciate it.
>
>> Now there are two problems with my work:
>> 1) The first is something we all are tired to talk about: 
>> manual memory management. I make a proof of concept and am 
>> writing the code that is 100% marked as @nogc. It has side 
>> effects. For example I allocate exceptions and thay should be 
>> freed after catching - it is something, phobos doesn't do. As 
>> said it is an experiment; I would like to see how it works.
>>
>> 2) Performance. The main reason I started the writing at all 
>> is that the existing implementations seem to have only 
>> performance as criterium. Performance is super important, but 
>> not on the cost of design, usability and extensibility. For 
>> example in vibe.d (and libasync) everything possible is 
>> defined as structs, everything that would be interesting to 
>> extend is final; and after it you go to phobos and see a 
>> "workaround". For example Mallocator is a struct but you have 
>> to be sure, it is an allocator. How do you force the right 
>> interface?
>
> That is a valid point. I know it is hard to get the best 
> performance and optimal API design at the same time. The reason 
> the methods are final is to avoid the overhead of virtual 
> method indirection.
>
>> static if (hasMember!(Allocator, "deallocate"))
>> {
>>    return impl.deallocate(b);
>> }
>> else
>> {
>>    return false;
>> }
>>
>> Somethinkg like this would be ok for C. But for a language 
>> with interfaces, it is ugly design independent of how it 
>> performs. Everything I say here is IMHO.
>
> This would mean we need a new design pattern that supports both.
>
>> Except these two points I'm interested in some kind of 
>> collective work aswell. It is very difficult as one man job. I 
>> didn't know other people are also working on similar 
>> implementations. Nice to know.
>>
>> Are you aware of any benchmark tools in other languages that 
>> could be used?
>
> The benchmark tools available are mainly testing web servers. 
> And the exact operation pattern is not very clear. One of such 
> benchmark tool is wrk [https://github.com/wg/wrk] that measure 
> HTTP request speed. The problem is that it measure the 
> performance of the I/O and HTTP handling.
>
> Here are some benchmark results:
>
> * https://www.techempower.com/benchmarks/
> * https://github.com/nanoant/WebFrameworkBenchmark
>
> How can D be worse than Java ? 
>
> My strategy would be to split the problem. First get the async 
> I/O optimal. Then get HTTP handling optimal, and finally get 
> database interaction optimal (the optimal async I/O should 
> help). An investigation on the methods used by Java/undertow to 
> get these performances could help.
>
>
> I would suggest to implement a benchmark client doing some 
> predefined patterns of I/O operations similar to web 
> interactions or the most common types of interactions. And a 
> server implemented in C using native system I/O operations. 
> This server implementation would then be our reference.
>
> What would be measured is how much slower our different D 
> implementations are relative to the C reference implementation. 
> This will allow us to have a benchmarking test that doesn't 
> depend that much of the hardware.

Yes. it would be a way to go.

As I see Kore performs pretty well. One could write bindings 
first and then begin to rewrite step for step. On every 
development step you have a working http server and you can use 
these http-benchmark tools for the benchmarking.

I have to look in it in the next weeks


More information about the Digitalmars-d-learn mailing list