Mmm… I would agree with it - if I add the semaphore to the the parallel run method, it works better, but seems parallel operations are not really effective in Aspose.
There is an interesting note: if I ran 64 tasks in sequence, and then run 64 tasks in parallel using max 8 operations simultaneously, it gives almost the same total time! (parallel sometimes even longer, ok, b/c of async overhead I suppose; I did tests on my laptop: AMD Ryzen Pro 7 CPU, 32 GB RAM, configuration: Release, Windows 11 OS).
And the more tasks I run, the longer total time for parallel operations become…
Here are results for 64, 128, 256 tasks:
=== PRESENTATION FROM SLIDE SEQUENCE:
...
[ASPOSE] From slide. ElapsedMilliseconds=37.8185 CloneElapsedMilliseconds=33.3415
[ASPOSE] From slide. ElapsedMilliseconds=30.4282 CloneElapsedMilliseconds=27.4804
[ASPOSE] From slide. ElapsedMilliseconds=27.8331 CloneElapsedMilliseconds=24.8783
=== PRESENTATION FROM SLIDE ASYNC:
...
[ASPOSE] From slide. ElapsedMilliseconds=1045.6124 CloneElapsedMilliseconds=1022.9042
[ASPOSE] From slide. ElapsedMilliseconds=1120.9866 CloneElapsedMilliseconds=1118.3301
[ASPOSE] From slide. ElapsedMilliseconds=1215.0383 CloneElapsedMilliseconds=667.0855
=== Total SEQUENCE milliseconds: 10935.9595
=== Total ASYNC milliseconds: 9526.5153
=== PRESENTATION FROM SLIDE SEQUENCE:
...
[ASPOSE] From slide. ElapsedMilliseconds=15.3091 CloneElapsedMilliseconds=14.3312
[ASPOSE] From slide. ElapsedMilliseconds=20.0109 CloneElapsedMilliseconds=18.1877
[ASPOSE] From slide. ElapsedMilliseconds=16.2789 CloneElapsedMilliseconds=14.867
=== PRESENTATION FROM SLIDE ASYNC:
...
[ASPOSE] From slide. ElapsedMilliseconds=491.6849 CloneElapsedMilliseconds=490.4524
[ASPOSE] From slide. ElapsedMilliseconds=1671.558 CloneElapsedMilliseconds=1670.2631
[ASPOSE] From slide. ElapsedMilliseconds=1671.4629 CloneElapsedMilliseconds=1670.2713
=== 128 Total SEQUENCE milliseconds: 25106.3231
=== 128 Total ASYNC milliseconds: 32748.2957
=== PRESENTATION FROM SLIDE SEQUENCE:
...
[ASPOSE] From slide. ElapsedMilliseconds=20.3652 CloneElapsedMilliseconds=19.1261
[ASPOSE] From slide. ElapsedMilliseconds=20.1624 CloneElapsedMilliseconds=18.8296
[ASPOSE] From slide. ElapsedMilliseconds=19.9699 CloneElapsedMilliseconds=18.7026
=== PRESENTATION FROM SLIDE ASYNC:
...
[ASPOSE] From slide. ElapsedMilliseconds=1934.4605 CloneElapsedMilliseconds=1004.2739
[ASPOSE] From slide. ElapsedMilliseconds=1934.7415 CloneElapsedMilliseconds=1004.3688
[ASPOSE] From slide. ElapsedMilliseconds=1978.5928 CloneElapsedMilliseconds=1976.6719
=== 256 Total SEQUENCE milliseconds: 71898.8163
=== 256 Total ASYNC milliseconds: 98164.7467
IDK… I would say something under the hood of the Aspose library prevents effective parallel works.
@andrey.potapov may be you have some thoughts/guides how parallelism can be leveraged correctly for Aspose operations?
changed code:
var semaphore = new SemaphoreSlim(8);
await Task.WhenAll(Enumerable.Range(0, 64).Select(async _ =>
{
await semaphore.WaitAsync();
await PresentationFromSlideAsync();
semaphore.Release();
}));