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