.NET (C#) vs. Fiber (Go): Performance (Latency - Throughput - Saturation - Availability)

แชร์
ฝัง

ความคิดเห็น •

  • @AntonPutra
    @AntonPutra  4 หลายเดือนก่อน +9

    🔴 To support my channel, I'd like to offer Mentorship/On-the-Job Support/Consulting (me@antonputra.com)

    • @sangeethnandakumar2534
      @sangeethnandakumar2534 4 หลายเดือนก่อน +1

      Amazing. Bro where can I find your C# and Go code used for testing. Any GitHub links?

    • @i.t.9015
      @i.t.9015 4 หลายเดือนก่อน +4

      Rust vs Go

    • @Nick-yd3rc
      @Nick-yd3rc 4 หลายเดือนก่อน +1

      Haskell please 🙏 ChatGPT can help🫠
      Scala sttp is a great wrapper, and akka/pekko perform very strongly in general with small heaps🤫

    • @ulrich-tonmoy
      @ulrich-tonmoy 4 หลายเดือนก่อน +1

      zig vs Rust
      Zig vs Go
      Haskell vs Elixir Vs Gleam

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน

      @@ulrich-tonmoy ok, just added to my list!

  • @Dr-Zed
    @Dr-Zed 2 หลายเดือนก่อน +52

    .NET should not be dropping requests whole using so little CPU. Something about the setup is wrong here.

    • @Raizin-d8p
      @Raizin-d8p 2 วันที่ผ่านมา

      Not only that but it doesn't make sense to have so many DB connections.
      I haven't looked at the code but I suspect bad quality code.

  • @F3nny
    @F3nny หลายเดือนก่อน +17

    Author of Fiber here, keep up the good work. If you are interested you should try enabling the Prefork option for even more performance.

  • @scosminv
    @scosminv หลายเดือนก่อน +12

    Now that .NET 9 is out, this would need a refresh. New server mode is biased towards low memory consumption + plethora of perf improvements

    • @mysteriouseyes6960
      @mysteriouseyes6960 25 วันที่ผ่านมา +1

      in fact,this benchmark has some issues,he's code show he was use dotnet 8.0 but he not open server gc model,in workstation gc QPS too low。

    • @oxXPMXxo
      @oxXPMXxo 20 วันที่ผ่านมา

      @@mysteriouseyes6960 the code in go as well. so why not do your own test instead

  • @__Michu__
    @__Michu__ 4 หลายเดือนก่อน +32

    I like these real world test scenarios. And I love that you increased RPS until failure. Please keep doing that with every benchmark

    • @__Michu__
      @__Michu__ 4 หลายเดือนก่อน

      I wish you would increase RPS in second test as well

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน +3

      thanks, will do! i started to use eks to run those tests...

  • @paarma1752
    @paarma1752 4 หลายเดือนก่อน +27

    The idle memory usage difference has its reasons. By default dotnet runtime just doesnt release its reserved memory unless there's memory pressure. If you want it to release it more aggressively, you should run it as a desktop workload instead of a server workload (default).

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน +3

      noted, memory does not play a significant role in these benchmarks

    • @Sam-gd4xp
      @Sam-gd4xp 4 หลายเดือนก่อน +7

      Oooo reasons, reasons, reasons, come one, face it, Go lang with simpler approach without OOP studpidity rulset has shown it can perform. We kewn all a long, that is a case. Face it, Go lang is the new "C#" as new popular language for beginners. Modern C# is just what C++ was in the 80s. Even C# author said, C# is more C++ replacement that Java replacement.

    • @paarma1752
      @paarma1752 4 หลายเดือนก่อน

      @@Sam-gd4xp oh, I like golang as well and I've used it alot ❤️ But personally I wouldn't have courage to start developing a large scale enterprise-y system with it. Everything being so simple and imperative means there are more statements you'll have to manage, which means you'll have more state to manage, which means there'll be more chance for bugs. Golang's range requires much more statements, state and ceremony than C#'s Select(...).Where(...).GroupBy(...).Join(...).OrderBy(...)... I know there are some more functional slice utils, but still a lot is missing. C#'s LINQ (with and without EF), expressions and way superior generics is something I personally couldn't develop a large scale system without... But I do love to use golang for more algorithmic stuff and I'm also super interested in how golang's generics and itetators will turn out and improve 😋

    • @keyser456
      @keyser456 4 หลายเดือนก่อน +23

      ​@@Sam-gd4xp Don't be a fanboi

    • @ladrillorojo4996
      @ladrillorojo4996 4 หลายเดือนก่อน +5

      @@Sam-gd4xp No, C# is so flexible that it can and needs to be optimized for a particular task.

  • @Denominus
    @Denominus 4 หลายเดือนก่อน +28

    Your methodology is excellent. I much prefer this to the gamified mess that techempower has become. Startup time/cost, container size, memory/cpu usage, baseline memory/cpu usage are extremely valuable to us.

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน +1

      thank you!

    • @123mrfarid
      @123mrfarid 3 หลายเดือนก่อน

      ​@@AntonPutra mas anton, ayo bikin site kaya techempower. Hasilnya ditunjukkan di site. Di run setiap tahun sekali utk bahasa2 populer

  • @yurii1111
    @yurii1111 4 หลายเดือนก่อน +115

    Cool test actually.
    A few possible improvements except trying the AOT:
    1. Try enabling a full PGO (tiered PGO is enabled in .NET 8):
    # Full PGO
    ENV DOTNET_TieredPGO=1
    ENV DOTNET_TC_QuickJitForLoops=1
    ENV DOTNET_ReadyToRun=0
    2. Use slim app configuration:
    WebApplication.CreateBuilder() vs WebApplication.CreateSlimBuilder()
    3. Try increasing the minimal number of threads:
    ThreadPool.GetMinThreads(out _, out int completionPortThreads);
    ThreadPool.SetMinThreads(100, completionPortThreads);

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน +12

      thanks for the tip! I'll definitely try it next time!

    • @kurumi690
      @kurumi690 4 หลายเดือนก่อน +16

      ​@@AntonPutra yeap, it would be interesting with Native AOT too

    • @luvincste
      @luvincste 4 หลายเดือนก่อน

      also the two async operations (await cmd.ExecuteNonQueryAsync() and await amazonS3.Upload(appConfig.S3Bucket, image.ObjKey, appConfig.S3ImgPath)) are running sequentially, while they could be started both together and awaited after they both have been started; sure, it's a small to really small improvement, but this is the point of knowing well the language and doing a test well: it's not easy *at all*

    • @johnhershberg5915
      @johnhershberg5915 4 หลายเดือนก่อน +11

      @@AntonPutra I actually think you tested it fine. AOT is only for startup time. Tiered PGO is the default, so it makes sense to keep it here. My one complaint is that if you want this to be a "real world" test case your code should use Entity Framework as that's the most standard thing. I took a look at the code and you're doing it with Npgsql's built-in datasource. I don't know anyone who would do this in a real world application. There's all sorts of caching that you're missing from Entity Framework.
      Note that I think the way you did it is actually faster. EF has overhead. But I would still very much like to see that comparison instead.

    • @neonmidnight6264
      @neonmidnight6264 4 หลายเดือนก่อน +18

      None of these are needed, with vanilla configuration .NET is strictly better than Go. Anyone who ever looked at Go's compiler output and GC throughput knows that both are underwhelming. Note that for *small* deployments like these using NativeAOT is a good idea. .NET 9 also enables DATAS by defvault which is a new GC mode for more dynamic scaling of active heaps and their sizes based on load profile. This massively improves low heapsize scenarios like this one. Generally speaking you have to understad that for high throughput workloads 256mi is anemic. Bump it up to 512mi and you will see a completely different picture. Same applies to more core which .NET's threadpool and task system can utilize much more effectively than fixed runtime threads setup in Go. Lastly, I suspect the culprit here is S3 SDK, as it has quite room for improvemet and Amazon posted like a week ago that the have new preview version which is faster and has much less wasted allocations. The open question is also about Go using connection pool while .NET seemingly avoids opting into that, which would impact the behavior significantly and make it apples to oranges comparison.

  • @anhcoder
    @anhcoder 3 หลายเดือนก่อน +72

    11 years with .NET at my main jobs (I'm a solution architect), 6 years with Golang (side projects for other clients' companies). I think .NET is more suitable for fast development, quick adaptation to changes, and Enterprise-focused products. Golang is better for cost-efficient projects, but requires more maintenance.

    • @MrSamisack
      @MrSamisack 2 หลายเดือนก่อน +1

      hi! what do i need to lear to become a .net solution architect?

    • @anhcoder
      @anhcoder 2 หลายเดือนก่อน +6

      @@MrSamisack it's often start with system thinking, learn how a system works, what are components, how to make it secure and realiablely. 4th-8th years try to build all skillset that you target to be master.
      .NET ecosystem , Cloud Provider, Database, AI... I spent almost 12-15 hours per days for learn and practices.

    • @MrSamisack
      @MrSamisack 2 หลายเดือนก่อน

      @@anhcoder thanks 🫂

    • @UCrjhmrVAvDXjApQo4EH
      @UCrjhmrVAvDXjApQo4EH หลายเดือนก่อน

      why does goland requires more maintenance

    • @anhcoder
      @anhcoder หลายเดือนก่อน +2

      @ more code, more simple, more customization, more dead and opensource libs then more maintenance cost.

  • @zephyrprime
    @zephyrprime 2 หลายเดือนก่อน +19

    I don’t understand why both start dropping request while cpu usage is nowhere near 100 and memory usage is less than 50%

    • @shanonjackson5528
      @shanonjackson5528 2 หลายเดือนก่อน +3

      Imagine this might be due to OS syscall bottleneck or physical hardware bottleneck (network card throughput)

    • @rozrewolwerowanyrewolwer391
      @rozrewolwerowanyrewolwer391 2 หลายเดือนก่อน +1

      maybe one core of processor is used on 100% and other at 20%

    • @ciprianfc
      @ciprianfc หลายเดือนก่อน +2

      the problem is in the Config.cs, he is loading the entire configuration each time he needs a configuration value.

    • @IncomingLegend
      @IncomingLegend หลายเดือนก่อน +1

      bogus tests

  • @zhh174
    @zhh174 4 หลายเดือนก่อน +42

    Use native aot for C#. Memory usage will be way less, and startup time will be very fast

    • @deado7282
      @deado7282 4 หลายเดือนก่อน +14

      AOT is not a sensitive default since it limits you in terms of 3rd party packages.

    • @neonmidnight6264
      @neonmidnight6264 4 หลายเดือนก่อน

      @@deado7282 it is an ok default if you deploy to piss weak anemic container configurations and then have to scale with replica count and nodes, because go cant optimally do otherwise, instead of scaling up individual container resources, the ecosystem is in a different place now anyway

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน +4

      i'll try

    • @ladrillorojo4996
      @ladrillorojo4996 4 หลายเดือนก่อน +9

      @@deado7282 Fiber also limits you. That would be far more fair. Not to mention that there's something bad with the C# build, because my projects are way bigger in code but way smaller when built. He did something bad.

    • @dasiths
      @dasiths 4 หลายเดือนก่อน +2

      This would be a fair comparison to fiber as it is the fastest option to run aspnetcore.

  • @RobinVeldhuis
    @RobinVeldhuis 3 หลายเดือนก่อน +8

    At 8:01 you mention that theres a significant higher latency for C#. It looks worse than it actually is, since the graph doesn't start at zero (unlike the other graphs in this view). The difference is still significant, but being mindful about these things adds clarity for the viewer and potentially saves you from a wrong conclusion in the future :)

  • @cheukmingau983
    @cheukmingau983 4 หลายเดือนก่อน +38

    To further reduce the image size of Golang, you can use UPX to further compress the executable which usually results in 40-50% file size reduction.

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน +5

      cool, thanks for the tip! i'll try it out. Does it affect performance, or just in case you need to debug something?

    • @ArnabAnimeshDas
      @ArnabAnimeshDas 4 หลายเดือนก่อน +2

      @@AntonPutra startup time will increase by a miniscule amount as it needs to decompress before running. For this use case, using UPX is a good move as it will reducesdownload time.

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน +1

      ​@@ArnabAnimeshDas got it. unfortunately, it's hard to measure boot time in Kubernetes because the minimal interval is 1 second, and I want to focus these benchmarks on Kubernetes.

    • @EraYaN
      @EraYaN 4 หลายเดือนก่อน +5

      Also the images are already compressed by the container registry and runtime. So double compression is not all that effective in general. Something like the trimming and Native AOT in .NET does help a bunch though. Go already does a fairly okay job.

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน

      @@EraYaN 👌

  • @marcwinner567
    @marcwinner567 4 หลายเดือนก่อน +3

    Keep the benchmarks coming! Love it!

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน +1

      thanks! will do, rust vs go coming in couple of days :)

  • @darkogele
    @darkogele 4 หลายเดือนก่อน +10

    I have never seen dotnet to drop requests if is not 95% plus on cpu ram etc this is just weird.

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน +1

      i'll add more metrics next time from cadvisor - github.com/google/cadvisor/blob/master/docs/storage/prometheus.md

  • @korzhs
    @korzhs หลายเดือนก่อน +5

    Thanks for the thorough test! Why do you use .NET 6 while the latest LTS version is .NET 8 ?

    • @AntonPutra
      @AntonPutra  หลายเดือนก่อน

      my pleasure! i used 8.0, you can see it from the source code - github.com/antonputra/tutorials/blob/main/lessons/202/cs-app/Dockerfile#L1

  • @terjeber
    @terjeber 26 วันที่ผ่านมา +1

    One thing to add - about 10% of men have reduced color vision. For those of us, the difference between these two graphs are almost impossible to distinguish.

  • @alberkhan
    @alberkhan 4 หลายเดือนก่อน +7

    Can you please create a comparison video between go and PHP Swoole?

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน +4

      ok!

  • @pandhuprisnawan165
    @pandhuprisnawan165 3 หลายเดือนก่อน +2

    Congrats you got new subs!!
    Love with your test, please add more C# comparison

    • @AntonPutra
      @AntonPutra  3 หลายเดือนก่อน +1

      thanks! will do more in the future

  • @IvanRandomDude
    @IvanRandomDude 4 หลายเดือนก่อน +12

    I mean, it is gin, one of the slowest go libraries. You used Fiber in the last video.

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน +2

      microsoft compared .net with gin, i used fiber in this video - github.com/antonputra/tutorials/blob/main/lessons/202/go-app/main.go#L12

    • @einstein_god
      @einstein_god 4 หลายเดือนก่อน

      Gin is not slow…

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน +2

      @@einstein_god I've been using it for benchmarks, it is definitely slower than fiber..

  • @ChandanSomani
    @ChandanSomani 7 วันที่ผ่านมา

    This is really Informative... superb work, super setup, i would really like to learn to do this

  • @mmacgearailt
    @mmacgearailt 4 หลายเดือนก่อน +2

    This is the first test video I've seen of yours and I love how thorough you are, from methodology and tools, to the results. However, as someone who is color deficient, I cannot tell the difference between low-contrast colors easily or at all. For your next test, please use high-contrast colors for all test subjects.

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน

      thank you! it's just default colors that Grafana uses for two different subjects, i'll see if i can improve

  • @willl0014
    @willl0014 2 หลายเดือนก่อน

    I am loving these videos

  • @amrabdelhady
    @amrabdelhady 4 หลายเดือนก่อน +9

    Why some requests start to drop? I see the CPU utilization and memory usage are very far from 100%. Where is the bottle neck coming from?

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน +3

      it depends on the implementation of the http server, some prefer to drop others try to process every single request...

    • @hupett
      @hupett 4 หลายเดือนก่อน +11

      My thoughts exactly. Something in the setup of both versions are bad, neither go and c# seems to utitlize resources nowhere near 100%, yet they all start failing request. Maybe they can't see the resources they have available or similar and they are throtthling themselves by using less thread/connection/something that they could. Go (fiber) ofc will win anyways, but based on my very similar tests, the difference is only 10-15% in requests per second and this was with net6, not net8 (which can be significantly faster).

    • @metaltyphoon
      @metaltyphoon 4 หลายเดือนก่อน +2

      @@hupett his repo has .net 8 not 6

    • @hupett
      @hupett 4 หลายเดือนก่อน +4

      ​@@metaltyphoon yes, which means the margin should be even smaller for him compared to what I measured in net6 era, since net8 is faster then net6. My tests were capping cpu, but here we can see both frameworks failing without using the available resources, so something seems off.

    • @viacheslavsamodelkin6944
      @viacheslavsamodelkin6944 4 หลายเดือนก่อน

      This is where GC starts to kick in. If we use something like dotnet-monitor for monitoring GC in Prometheus that might show us the real picture

  • @murat.yuceer
    @murat.yuceer 3 หลายเดือนก่อน +5

    Can you try again with .net 9

    • @AntonPutra
      @AntonPutra  3 หลายเดือนก่อน +4

      yes in the new benchmark i'll use .9 version

    • @murat.yuceer
      @murat.yuceer 3 หลายเดือนก่อน

      @@AntonPutra do you use ef core, if you do, use dbcontextfactory in offical doc

  • @mrt2525
    @mrt2525 4 หลายเดือนก่อน +7

    I'm sure you didn't make any adjustments to the operating system. .net core doesn't give me any problems until it reaches 50k/sec.

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน +1

      no vanila kubernetes cluster with containerd runtime. 2cpu and 256mb memory - github.com/antonputra/tutorials/blob/main/lessons/202/deploy/cs-app/deployment.yaml#L26-L32
      have you tried it in k8s or just standalone? default file descriptors 1024 could play a role as well

    • @davidmartensson273
      @davidmartensson273 3 หลายเดือนก่อน

      I was also surprised, I did some local test during spring for our new services and could easily handle 15 000 requests per second on my machine, though I did not run under k8s and did have more memory and CPU.
      BUT I did not test 15 000 clients though.
      @AntonPutra did your test use concurrent clients doing separate calls or just requests?
      That could make a difference I think, especially if the clients connect using HTTP/2 in which case one client would be able to do many many more requests in the same time since you save on TCS setup, and that might account for the higher numbers I got.

  • @MagicNumberArg
    @MagicNumberArg 4 หลายเดือนก่อน +2

    Hey, great job! One comment I have is: a lot will come down to how good the Amazon S3 and Postgres are optimized, and in DOTNET MS SQL and Azure Blobs will probably be a priority. Could you do a dedicated test for streaming back local file by id (from disk)? That would show how much HTTP connections specifically each app can handle.

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน

      Thanks! I was actually thinking about Kafka consumer/producer implementations and maybe a simple ETL pipeline. What do you think?

  • @davesaah
    @davesaah 4 หลายเดือนก่อน +2

    Can you do a video on how to create these graphs to test apis. Thanks

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน

      I have few tutorials that can help
      1. github.com/antonputra/tutorials/tree/main/lessons/135
      2. github.com/antonputra/tutorials/tree/main/lessons/136
      3. github.com/antonputra/tutorials/tree/main/lessons/137

  • @Cuca-hn3md
    @Cuca-hn3md 4 หลายเดือนก่อน +1

    I like this kind of content, you've got one more subscriber! 😊

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน +1

      thank you! rust vs go coming in couple of days :)

  • @carlobenedetti2407
    @carlobenedetti2407 3 หลายเดือนก่อน +3

    I am curious about the performance of .NET Orleans compared to Go

    • @AntonPutra
      @AntonPutra  3 หลายเดือนก่อน +1

      ok, noted!

  • @kovlabs
    @kovlabs 4 หลายเดือนก่อน +5

    Nice work
    Can you do Java vs C# next ?

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน +4

      thanks, maybe not next but i'll do it for sure

    • @Tolg
      @Tolg 4 หลายเดือนก่อน

      @@AntonPutra Please do! Looking forward to seeing the same test between Java vs C#. Also would be great to use .Net Native AOT.

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน +1

      @@Tolg i got PR for aot so i'll be definitely testing it soon.. - github.com/antonputra/tutorials/tree/main/lessons/202/cs-app-aot so i'll be testing

  • @THE_NE0
    @THE_NE0 4 หลายเดือนก่อน +68

    This comparison is not fair, as you didnt compile the minimal api using AOT

    • @bibahbibah5108
      @bibahbibah5108 4 หลายเดือนก่อน +12

      still c# have a very good perform, i think it has the best performance for a general us language

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน +44

      Well, I used the available documentation that most people would use to compile and build Docker images. I'm pretty sure you can optimize both Go and C# further. But I get your point, and next time I'll test with AOT as well. If you have anything that could help me optimize .NET, please share it, and I'll definitely use it!

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน +13

      have you tried rust? :)

    • @bebobauomy1265
      @bebobauomy1265 4 หลายเดือนก่อน +5

      @@AntonPutra unless you change the algorithm you uses, there is not a lot of options that can be used to optimize your Go app, you only have the PGO (which also can be used with C#). In C# you just have to compile the program like Go to get a better performance.

    • @THE_NE0
      @THE_NE0 4 หลายเดือนก่อน +1

      @@AntonPutra luckily when you create a .NET solution you have the choice of selecting web api with AOT, which is a very good starting point, i strongly recommend you to check it out as it has a huge performance difference and the boot time is reduced, the only downside i would say is the image size.
      I made a POC for my company, it was a stress test of 1000 concurrent users making 1000 requests each and the memory stayed at 30mb with cpu to 1.5%

  • @flygonfiasco9751
    @flygonfiasco9751 9 วันที่ผ่านมา

    You could have used distroless image for .NET as well. 8.0-noble-chiseled

  • @romankoshchei
    @romankoshchei 3 หลายเดือนก่อน +3

    Will you test with Native AOT C# app?

    • @AntonPutra
      @AntonPutra  3 หลายเดือนก่อน +1

      yes, next week. first python then c#aot

  • @Myself0094
    @Myself0094 2 หลายเดือนก่อน +1

    Nice work, man. One thing is I wonder why dotnet starts to drop packets and latency having so few of the cpu time and memory consumed. I managed to make it serve smth like several thousands of requests per second on a single thread with 200mb of ram and batched sql server inserts, on a windows machine though

  • @statalys
    @statalys 24 วันที่ผ่านมา +1

    Once a couple of years ago I had to use .NET CORE C# on Linux and it ate up a lot of memory and CPU. Since then nothing has changed. I can be told that I haven't optimized my .NET environment, but I don't understand why it isn't optimized out of the box

    • @AntonPutra
      @AntonPutra  23 วันที่ผ่านมา

      interesting, i'll be doing a new one soon with .net 9

  • @TweakMDS
    @TweakMDS 4 หลายเดือนก่อน +12

    Once again a spectacularly well thought out test. We can say that C# wins a proud silver medal in this head to head :D
    Would you be interested in a fresh comparison of some of the different javascript runtimes, like node.js, deno and bun?

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน +3

      thanks! yes but next rust vs go with new updated frameworks and sdks :)

  • @SajadJalilian
    @SajadJalilian 17 วันที่ผ่านมา

    You should ask community to create most efficient app they can and give them time to do that on github. Then test them. That would be the best compression in existence

  • @Monkeydew1o2
    @Monkeydew1o2 หลายเดือนก่อน

    It's crazy how closely aligned the GO and C# RPS was to start. There has to be an external limiting factor.

  • @RockTheCage55
    @RockTheCage55 4 หลายเดือนก่อน +2

    Excellent test & very thorough....thanks.

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน

      thank you!

  • @lczago
    @lczago 4 หลายเดือนก่อน +2

    Do a Go vs PHP please. We know Go is faster, but it would be interesting to see the differences. You can use FrankenPHP or Symfony Flex.

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน

      ok will do in a week or so

    • @kahnfatman
      @kahnfatman 2 หลายเดือนก่อน

      Seems unfair because PHP does not run by itself. Lower level of socket connection is handled by either Apache or Nginx.

  • @papa_ethan
    @papa_ethan 3 หลายเดือนก่อน +2

    C# VS Java?

    • @AntonPutra
      @AntonPutra  3 หลายเดือนก่อน

      ok coming

  • @dsha256
    @dsha256 2 หลายเดือนก่อน +1

    Interesting, thanks! What about Temporal vs Kafka next?

    • @AntonPutra
      @AntonPutra  2 หลายเดือนก่อน

      ok noted!

  • @jaans3712
    @jaans3712 4 หลายเดือนก่อน +3

    You have found some kind of holy grail of programming content for TH-cam 😄 Very addictive videos -> I subscribed

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน

      thank you! :)

  • @MrSamisack
    @MrSamisack 2 หลายเดือนก่อน

    Excellent video with a very very good testing methodology! Just one note: next time can you use colors that are better differentiated? (i'm colorblind). Thanks!

  • @lukavranes2492
    @lukavranes2492 4 หลายเดือนก่อน +1

    Very informative as always, thanks
    also just a thought, maybe revisit apache vs nginx. mpm_event module for apache with default config sounds pretty strong
    I'd like to see how they would compare now
    keep up the good work

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน

      thank you! will do! is mpm_event module enabled by default or i need to turn it on?

  • @SeyedarmanFatemi
    @SeyedarmanFatemi หลายเดือนก่อน +1

    Hey, can you please compare latest version of dotnet 9 with golang again?

    • @AntonPutra
      @AntonPutra  หลายเดือนก่อน +2

      yes will do soon

  • @leonperes
    @leonperes 4 หลายเดือนก่อน +1

    Would be interesting to know how to setup all this

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน +1

      well i have all source code, including terraform, helm charts everything even dashboards in the repo, link in the description - github.com/antonputra/tutorials/tree/main/lessons/202

  • @jozsab1
    @jozsab1 4 หลายเดือนก่อน +2

    I personally would love some exotic test like Rust, c++ ( oatpp, crow.. ), apache compared to GO.

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน

      noted!

    • @jozsab1
      @jozsab1 4 หลายเดือนก่อน

      @@AntonPutra after i made the comment youtube recomended your rust, node, java ... comparisons. awesome work !

    • @jozsab1
      @jozsab1 4 หลายเดือนก่อน

      @@AntonPutra while at it. I see more an more job postings for python django, fast api, flask. I would expect these to perform "bad", but so many people choose them. I wonder if they are good or not

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน

      ​@@jozsab1 It's a very reliable and well-tested framework. We've been running Django as the main API gateway at the company where I work for the last few years with no issues at all. However, most of our other microservices are written in Go :)

    • @jozsab1
      @jozsab1 4 หลายเดือนก่อน

      @@AntonPutra I'm not a webdev, for me it's just raw numbers vs raw numbers. For you, maybe a topic to explore / make another video

  • @pushthetemple
    @pushthetemple 4 หลายเดือนก่อน +10

    maybe try some functional or new language? i suggest elixir and gleam for next video:)

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน

      okay, will do. i hope they have up to date aws sdks. :)

  • @JeremyKruer
    @JeremyKruer 2 หลายเดือนก่อน

    How realistic is it to use Fiber for production workloads? What is a more realistic framework for enterprise prod workloads in Go?

    • @AntonPutra
      @AntonPutra  2 หลายเดือนก่อน +1

      i think standard library is goon enough since 1.21

  • @kamurashev
    @kamurashev 4 หลายเดือนก่อน +2

    Nice stuff! Thanks

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน

      thank you!

  • @faximori
    @faximori 4 หลายเดือนก่อน +2

    Please repeat the test in November with .NET 9

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน

      will do, i got a lot of feedback how to optimize it as well, haha

  • @IgnacioTaranto
    @IgnacioTaranto 4 หลายเดือนก่อน +1

    It seems you didn't read any of the comments from the Go/Java comparison, the Go binary can be further reduced by removing debugging symbols with the linker options `-s -w`.
    You are also using an outdated AWS SDK.

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน +1

      it is in this video, and the difference is only 6 MB - th-cam.com/video/56TUfwejKfo/w-d-xo.html
      I'll update sdk in the next lesson, but it does not affect performance it's just a wrapper around rest api

  • @flygonfiasco9751
    @flygonfiasco9751 9 วันที่ผ่านมา

    .NET framework is an overloaded term in the .NET ecosystem since it refers to the legacy framework

  • @riendlyf
    @riendlyf 4 หลายเดือนก่อน +1

    Can you uncover cloud language winglang? What is your opinion about this approach ?

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน

      interesting, looks like they integrate cloud sdks to the standard library.. so it sort of wrapper around all clouds? how well it is supported? I'll take a look...

  • @dondonondon8577
    @dondonondon8577 2 หลายเดือนก่อน +1

    is it Delphi from Embarcadero good in 2024?

    • @TuNguyenHuu-i7f
      @TuNguyenHuu-i7f หลายเดือนก่อน

      Delphi is still one of the best UI library and IDE. But the price is so crazy

  • @darkogele
    @darkogele หลายเดือนก่อน

    Hey Anton can you redo the tests now with .NET 9 that is out?
    Microsoft claims that is 10 times faster then NodeJS(Express) and 5 times Faster then Go(GIN)

  • @VoroninPavel
    @VoroninPavel 4 หลายเดือนก่อน +2

    Which memory usage do you measure? Reserved or Committed? .NET GC eagerly reserves a lot of memory upfront, but does not commit it until necessary. in .net 8 they introduced Dynamic Adaptive GC mode, but it's on by default only for AOT application.
    DOTNET_gcServer=1
    DOTNET_GCDynamicAdaptationMode=1
    Or System.GC.DynamicAdaptationMode

    • @VoroninPavel
      @VoroninPavel 4 หลายเดือนก่อน

      Also, C# compiler interns strings by default, AFAIK Go does not, so you give slight advantage to C# in this case.=)

    • @AJax2012
      @AJax2012 4 หลายเดือนก่อน

      The repo is in his profile under "Tutorials". It's the most recent commit atm.

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน +2

      well the same as kubernetes uses to oomkill my applications :) to be more precises container_memory_working_set_bytes / container_spec_memory_limit_bytes

  • @ajiics3469
    @ajiics3469 4 หลายเดือนก่อน +2

    Please test drogon framework 🙏

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน +2

      this one? drogon.org/

    • @suyulmaz4
      @suyulmaz4 4 หลายเดือนก่อน

      @@AntonPutra it would ne interesting to see a c++ web framework and go comparison.

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน

      ​@@suyulmaz4 Sure, any specific C++ framework in mind? Also, would you add any new test scenarios?

  • @akknaodinden
    @akknaodinden 4 หลายเดือนก่อน +4

    Автор плодит холивары. Почему-то он взял AspNetCore старой версии, не запублишил(то есть нет компайла в AOT нейтив), без тримминга без ничего и сравнивает производительность с Go(который по умолчанию AOT), ближайшим аналогом которого для тестирования подобных задач больше подошел бы Blazor из мира Dotnet.

    • @VoroninPavel
      @VoroninPavel 4 หลายเดือนก่อน +2

      AOT не надо, PGO после "прогрева" должен дать более оптимизированный код, чем получится при AOT.

    • @VoroninPavel
      @VoroninPavel 4 หลายเดือนก่อน +1

      Интересно другое: (из доков)
      When multiple containerized apps are running on one machine, Workstation GC might be more performant than Server GC

    • @akknaodinden
      @akknaodinden 4 หลายเดือนก่อน

      @@VoroninPavel У меня фобия что после PGO что-то отпадёт.

    • @VoroninPavel
      @VoroninPavel 4 หลายเดือนก่อน

      @@akknaodinden ну это только если там бага какая суровая.
      Еще интересно бы посмотреть на тест не с CreateBuilder, а CreateSlimBuilder()

    • @VoroninPavel
      @VoroninPavel 4 หลายเดือนก่อน

      @@akknaodinden странно. Ютьюб как-то через раз ответы отправляет.
      Писал, что интересно еще сравнить производительность, когда не CreateBuilder, а CreateSlimBuilder

  • @xelesarc1680
    @xelesarc1680 4 หลายเดือนก่อน +1

    I like this comparison keep up like this for benchmark maybe with aot make some difference

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน

      thanks, I'll try AOT next time

  • @JoshuaAndrewsza
    @JoshuaAndrewsza 19 วันที่ผ่านมา

    Please can we get an update for .net 9?

  • @eduardodbarretejr
    @eduardodbarretejr 2 หลายเดือนก่อน

    What diagram tools are you using

  • @lintaoamons5712
    @lintaoamons5712 3 หลายเดือนก่อน +1

    should also compare the image size

    • @AntonPutra
      @AntonPutra  3 หลายเดือนก่อน

      noted

  • @Ryudith
    @Ryudith 3 หลายเดือนก่อน +1

    Please test elixir phoenixframework compare to golang fiber and rust actix web. Thanks. 😁

    • @AntonPutra
      @AntonPutra  3 หลายเดือนก่อน +1

      ok noted!

  • @wudewang9947
    @wudewang9947 4 หลายเดือนก่อน

    In test 1, in C# , the json serialization can a improve by setting the context

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน

      noted! i'll try next time when i prepare a test with c#

  • @UnniMana
    @UnniMana 4 หลายเดือนก่อน

    Your videos are very interesting ... Keep doing it.
    I have one question.
    Is it possible for you to create videos for gin, fiber and echo frameworks?
    thank you

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน +1

      thanks you! i'll see what i can do and when

  • @pytorche6206
    @pytorche6206 4 หลายเดือนก่อน

    I had a look at the source code a and configuration after the last video and I wondered why you used minIO. Thanks for giving the explanation. I did not know it supports (partially) the S3 API. At work, we have an application that uses it but more as a cloud agnostic object storage.
    The use cases here are more realistic than the tech empower benchmarks ones. The none fixed size of the DB pool for DotNet impacts the latency, opening a connection to the DB (especially if TLS was used) is expensive.

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน

      thanks! minio can also be used as a replacement for hadoop for some data lake stuff, etc. It uses significantly less disk space while supporting the same replication, but it's harder to scale. If you are on-prem, it's a viable alternative. I agree with the pool size, just the defaults, no more, no less.

  • @AaronMartinColby
    @AaronMartinColby 3 หลายเดือนก่อน +1

    Genuinely shocked by these results.

  • @sinanbozkus
    @sinanbozkus 2 หลายเดือนก่อน

    Great video, thank you!

  • @03shyam
    @03shyam 4 หลายเดือนก่อน

    Could you do a performance comparison between Rust Actix and Golang GoMicro?
    Thank you.

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน

      Well, I just finished testing Rust Actix with Fiber in EKS and will upload in a couple of days. Why GoMicro? Anything special about that framework?

  • @PouriyaJamshidi
    @PouriyaJamshidi 4 หลายเดือนก่อน +1

    Nice video
    You might enjoy using Nim as well. Could be an interesting comparison

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน

      thanks, i'll take a look

  • @vinusuhas4978
    @vinusuhas4978 2 หลายเดือนก่อน +1

    So c# easily defeats node nestjs ?

    • @AntonPutra
      @AntonPutra  2 หลายเดือนก่อน +1

      i'll make some more tests in the near future

  • @ThinksOfNature
    @ThinksOfNature หลายเดือนก่อน

    HI CAN YOU DO one for golang and swift - hummingbird?

  • @nightmarenova6748
    @nightmarenova6748 4 หลายเดือนก่อน

    What specs do each of the nodes have and the controllers ?

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน +1

      4 CPUs and 8 GB of memory. From now on, I'm only testing apps in production-ready EKS clusters to make it similar to what we actually run in production environments. I use m6a.2xlarge EC2 instances for the nodes...

  • @CPiet-t4h
    @CPiet-t4h 4 หลายเดือนก่อน +1

    can you do go (fiber) vs rust (actix)

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน +1

      coming next..

  • @AntonPutra
    @AntonPutra  หลายเดือนก่อน

    🍿 Benchmarks: th-cam.com/play/PLiMWaCMwGJXmcDLvMQeORJ-j_jayKaLVn.html&si=p-UOaVM_6_SFx52H

  • @朝秦-f2h
    @朝秦-f2h 4 หลายเดือนก่อน +1

    Can you compare nodejs to bunjs? Thanks

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน

      ok, noted!

  • @MrLOPIU22
    @MrLOPIU22 4 หลายเดือนก่อน +3

    great video

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน

      thank you!

  • @naczu
    @naczu 2 หลายเดือนก่อน

    Can you also compare with rust-lang please ?

  • @Chinauptodate
    @Chinauptodate 2 หลายเดือนก่อน

    well, i can say that Golang is a beast

  • @majesticonyx
    @majesticonyx 4 หลายเดือนก่อน +1

    Can you do rust vs. go?

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน +1

      yes, coming next

  • @billn98
    @billn98 4 หลายเดือนก่อน

    Really cool benchmark. Can you do Dart Serverpod vs Go Gin too?

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน

      Gin? It's kind of slow, and I've already tested it. Maybe Fiber or standard library?

    • @billn98
      @billn98 4 หลายเดือนก่อน

      @@AntonPutra because Dart serverpod is new framework, and we wanna see how it compares against popular alternative like Gin. Comparing it with Fiber or std I think is useless, because we already know that they are too fast :).

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน

      @@billn98 noted

  • @ErazerPT
    @ErazerPT 4 หลายเดือนก่อน +3

    Sounds reasonable as a whole. .Net isn't particularly efficient unless you do a LOT of massaging. Then again, like ThePrimagen usually puts it, do you have more microservices than users? If I'm not doing high performance, I'd probably sacrifice efficiency for "ease of use and support", especially in a MS centric environment. If I am, then "who cares about your experience, fps for life" (old competitive Quake joke, where you'd sacrifice ANYTHING for more fps because max_speed was tied to fps).

  • @oxXPMXxo
    @oxXPMXxo 20 วันที่ผ่านมา +1

    Why C# fanboys always crying when they dont get the result that they want. If you want more optimization the same thing can happen in go. Do your own test without biases.

  • @julioleal2143
    @julioleal2143 4 หลายเดือนก่อน +1

    Hi there! Nice video, Thanks!!! Would be possible to do the same test, but using Java instead of .NET ? Maybe also Java x .NET as well 🙂🙂

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน

      thank you! noted!

  • @xelgoset70
    @xelgoset70 4 หลายเดือนก่อน +2

    Is it fair to compare a web framework specifically designed for maximum performance with many limitations and unimplemented web features to a standard enterprise application framework that has everything you need?
    At least this doesn't exactly match the title of the video.

    • @suyulmaz4
      @suyulmaz4 4 หลายเดือนก่อน

      Hi, which libraries are missing at go side for enterprise application needs, can you give some samples if possible please.

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน

      Well, internally most of the microservices we have are written in Go, some in Python, and data pipelines in Scala, Java, etc.

  • @a2zcourse
    @a2zcourse 3 หลายเดือนก่อน +1

    can you do Dart vs Js vs python ?

    • @AntonPutra
      @AntonPutra  3 หลายเดือนก่อน

      ok noted!

  • @davilinkicefire
    @davilinkicefire 4 หลายเดือนก่อน +1

    The comparison seem kind of fair, but they're room for improvement, but i think that a good general "default" setup representation.
    But small precision (with a little history):
    It's not dotnet api or dotnet core, it's the aspnetcore framework just like gin/fiber are web framework that you're testing against, they may exist other web framework for .NET, but i agree that is most popular and used one.
    Nowadays it's just .NET (or dotnet) no "Framework", when we say .NET framework, it mean the old .NET Stack that was only working/designed to work on windows (yeah.. yeah...I know about MONO, but that out of the scope for this simple history)
    dotnet core was/is the rewrite of the .NET stack from scratch. Microsoft choose to call it dotnet core, because at first it was only a subset of library (the core part), and apsnet core was also the rewrite from scratch of the web framework stack that only supported a subset of the aspnet MVC api, why they didn't change aspnetcore to aspnet, because it's already exist (they were (as far as i know) 3 Microsoft's web framework: ASPNET, ASPNET WebForm, ASPNET MVC (with 3 version of that framework is recall correctly)). So why did they change .NET core to .NET ? i don't know the real reason, but i have some idea like stopping people to not use the new improve version of .net because in their head .NET framework is the supported version of Microsoft versus .NET Core was not as feature complete and not maintainted as good by microsoft because it's now not part of the automatic windows update.
    Fun fact that most people don't know, but a certain point in time, you were able to start a apsnetcore project using the .NET framework and this was not a hack, it was a valid use case, but today the required version of .NET for aspnercore is too high and .NET framework support was dropped, but switching from aspnetcore using .NET framework to aspnetcore using .NET Core (now know as .NET) was really easy.

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน +1

      Thanks for the clarification. I didn't have any experience with .NET, but someone suggested trying it out with Minimal API, so I did. I'm learning a lot from the feedback I get, lol.

  • @m0n0x41d
    @m0n0x41d 13 วันที่ผ่านมา

    Шарп в AOT скомпилить и потом размеры контейнеров сравнить, не?

  • @rajivkumar-ub6uj
    @rajivkumar-ub6uj 4 หลายเดือนก่อน +5

    Hi Anton - waiting for monitoring setup in compose config from you :)

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน +1

      ok :)

  • @0xd3c0d3d
    @0xd3c0d3d 4 หลายเดือนก่อน

    I would love to see an experiment like this with Zig someday.

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน

      noted!

  • @daymaker_trading
    @daymaker_trading 15 วันที่ผ่านมา

    C# .NET 9 vs Java 🔥 Would be awesome!
    Thank you!

  • @ucretsiztakipci6612
    @ucretsiztakipci6612 4 หลายเดือนก่อน

    Is C# code built with configuration of Release or Debug mode. I can not see that.

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน +2

      release, i also got AOT verion will be testing soon

    • @kolebynov
      @kolebynov 2 หลายเดือนก่อน

      @@AntonPutra Did you really use Release mode? I checked Dockerfiles in your repo and I see that you use dotnet publish command without -c Release parameter. dotnet publish command builds app in Debug mode by default.
      Edit: I rechecked, since .NET 8, publish uses Release by default, so it seems everything is ok.

  • @papa_ethan
    @papa_ethan 3 หลายเดือนก่อน +1

    Best if you can draw conclusions.

    • @AntonPutra
      @AntonPutra  3 หลายเดือนก่อน

      thanks, i'll try it

  • @antoniusivan8767
    @antoniusivan8767 4 หลายเดือนก่อน +12

    C# view engine 10 years ahead of Golang. And for enterprise, consistent changing of go framework sure is a headache

    • @TehGM
      @TehGM 4 หลายเดือนก่อน +5

      Yeah. I think it's no surprise that Golang is faster - but .NET is well established and really powerful. And in real use case, it's still REALLY fast.
      Performance should only be the deciding factor when you REALLY need it. Majority of projects don't. In most cases, there's more to it - from ecosystem to team/personal experience and preference.

    • @Sam-gd4xp
      @Sam-gd4xp 4 หลายเดือนก่อน +1

      @@TehGM Not really! PRoblem is that developers are mad, that simpler idea like Go lang flies better that begemut C# with .Net

    • @TehGM
      @TehGM 4 หลายเดือนก่อน +6

      @@Sam-gd4xp You're either trolling or you simply never comprehended the idea of "different tools for different jobs".
      I've never seen anyone mad that Golang is faster. Everyone knows it, everyone accepts it, and people happily pick it when they need it. Both languages are tools, and only immatures do these kind of "performance wars" and call each other mad over it.

    • @antoniusivan8767
      @antoniusivan8767 4 หลายเดือนก่อน

      @@TehGM if you're the head of small startup and small firm, and you learn basic accounting and project management properly, you will see.
      That's why Google push so hard for kotlin multiplatform bro. But will it come? After so much Java VS kotlin legal battle

    • @olexandr.v
      @olexandr.v 4 หลายเดือนก่อน +1

      Go is known for it's backwards compatibility, i'm not sure what do you mean here

  • @msotho
    @msotho 4 หลายเดือนก่อน +16

    Go is solid!

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน +5

      it is, with very little optimization, and it's very fast

  • @nanonkay5669
    @nanonkay5669 4 หลายเดือนก่อน

    Basically, if you want something that works and easy, go with Java, C#, Node. If you want improved performance and efficiency without too much work, go with Go. If you want the most performance, speed and efficiency you can get, with the downside of complexity, go with C, C++, Rust

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน

      Rust is not ready for the cloud, with poorly maintained SDKs, and many of them are just slower than Go implementations. But in theory, Rust should be second after C.

    • @Comeyd
      @Comeyd 4 หลายเดือนก่อน

      @@AntonPutrareally? What did you use? That has not been my experience with Rust at all!

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน

      @@Comeyd actix with aws sdk and postgres driver + prom client, i'll publish in a day or so including source code

  • @salman2070
    @salman2070 4 หลายเดือนก่อน +3

    Is there a Node vs C# comparison ?

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน +2

      Not yet, but I'll make one soon. :) I do have other Node.js benchmarks, though in that playlist.

    • @salman2070
      @salman2070 4 หลายเดือนก่อน +1

      @@AntonPutra thanks, I've checked your playlist. Keep it up

    • @AntonPutra
      @AntonPutra  4 หลายเดือนก่อน

      @@salman2070 🫡