Performance issue with fiber
jfondren
julian.fondren at gmail.com
Sun Jul 25 02:44:18 UTC 2021
On Saturday, 24 July 2021 at 09:17:47 UTC, Stefan Koch wrote:
> On Wednesday, 21 July 2021 at 22:51:38 UTC, hanabi1224 wrote:
>> Hi, I'm new to D lang and encounter some performance issues
>> with fiber, not sure if there's something obviously wrong with
>> my code.
>>
>>
> There is your problem.
>> auto scheduler = new FiberScheduler;
>
> The Fiber scheduler will spawn a new fiber for every job.
> It will not use a fiber pool. Spawning a new fiber is expensive
> because of the stack allocation for it.
> Also if I recall correctly it will run single-threaded but I am
> not 100% sure on that.
> Just have a look at the running processes ... if you just see
> one than you are single threaded.
I get 8->3 seconds using vibe's fiber scheduler, which still
isn't competitive with Elixir.
```d
--- primes.d 2021-07-24 21:37:46.633053839 -0500
+++ primesv1.d 2021-07-24 21:35:50.843053425 -0500
@@ -1,16 +1,19 @@
/++ dub.sdl:
+ dependency "vibe-core" version="~>1.16.0"
+/
-import std;
-import core.stdc.stdlib : exit;
+import std.stdio, std.conv;
+import vibe.core.concurrency;
__gshared Tid mainTid;
__gshared bool terminated = false;
const int mailBoxSize = 1;
+extern(C) void _exit(int status);
+
void main(string[] args) {
auto n = args.length > 1 ? args[1].to!int() : 10;
- auto scheduler = new FiberScheduler;
+ setConcurrencyPrimitive(ConcurrencyPrimitive.workerTask);
scheduler.start({
mainTid = thisTid();
setMaxMailboxSize(mainTid, n, OnCrowding.throwException);
@@ -22,7 +25,7 @@
writeln(prime);
}
terminated = true;
- exit(0);
+ _exit(0);
});
}
```
build:
```
dub build --compiler=ldc -brelease --single primesv1.d
```
I think this is just a very goroutine-friendly test that relies
on constantly spawning fibers and abusing message-passing rather
than architecting out the concurrent parts of your program and
how they should communicate. std.parallel's more appropriate in D.
More information about the Digitalmars-d-learn
mailing list