To add a data point for Elixir: https://gist.github.com/neon-sunset/8fcc31d6853ebcde3b45dc7a... Note 1: The gist is in Ukrainian, and the blog post by Steve does a much better job, but hopefully you will find this useful. Feel free to replicate the results and post them. Note 2: The absolute numbers do not necessarily imply good/bad. Both Go and BEAM focus on userspace scheduling and its fairness. Stack ful coroutine…
How much memory do you need in 2024 to run 1M concurrent tasks?
111–120 of 205 posts
Re: How much memory do you need in 2024 to run 1M concurrent tasks?
#112This is a sample of 1 usecase, (so questionable real-worldness) but the difference is really eye-opening. Congrats to the C# team!
Re: How much memory do you need in 2024 to run 1M concurrent tasks?
#113Earlier quoted context omitted.
> Is that the ideomatic way to do it Well... I'm actually not sure what ideomatic means (English isn't my first language), but it's the standard way of doing it. You'll even find it as step 2 and 3 here: https://go.dev/tour/concurrency/1 > or the best way you can imagine I would do a lot much more to tune it if you were in a position where you'd know it would run that many "tasks". I think what many non-Go programmer…
Idiomatic is the word the parent was looking for. The base word is idiom. It was probably the intent of the parent to mean 'making use of the particular features of the language that are not necessarily common to other languages'. I'm not a programmer, but you appear to give good examples. I hope I'm not teaching you to suck eggs... {That's an idiom, meaning teaching someone something they're already expert in. Like…
Re: How much memory do you need in 2024 to run 1M concurrent tasks?
#114Consider the following code:
package main
import ( "fmt" "os" "strconv" "time" )
func main() {
numTimers, _ := strconv.Atoi(os.Args[1])
timerChan := make(chan struct{})
// Goroutine 1: Schedule timers
go func() {
for i := 0; i
}Also for Node it's weird not to have Bun and Deno included. I suppose you can have other runtimes for other languages too.
In the end I think this benchmark is comparing different things and not really useful for anything...
Re: How much memory do you need in 2024 to run 1M concurrent tasks?
#115I urge anyone making decisions from looking at these graphs to run this benchmark themselves and add two things:
- Add at least the most minimal real world task inside of these function bodies to get a better feel for how the languages use memory
- Measure the duration in addition to the memory to get a feel for the difference in scheduling between the languages
Re: How much memory do you need in 2024 to run 1M concurrent tasks?
#116Re: How much memory do you need in 2024 to run 1M concurrent tasks?
#117 import kotlin.time.Duration.Companion.milliseconds
import kotlin.time.measureTime
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.delay
suspend fun main() {
measureTime {
coroutineScope {
(0..1000000).map {
async {
delay(1.milliseconds)
}
}.awaitAll()
}
}.let { t ->
println("Took $t")
val runtime = Runtime.getRuntime()
val maxHeapSize = runtime.maxMemory()
val allocatedHeapSize = runtime.totalMemory()
val freeHeapSize = runtime.freeMemory()
println("Max Heap: ${maxHeapSize / 1024 / 1024} MB")
println("Allocated Heap: ${allocatedHeapSize / 1024 / 1024} MB")
println("Free Heap: ${freeHeapSize / 1024 / 1024} MB")
}
}
This produces the following output: Took 1.597011084s
Max Heap: 4096 MB
Allocated Heap: 2238 MB
Free Heap: 1548 MB
So whatever is needed to load classes and a million co-routines with some heap state. Of course the whole thing isn't doing any work and this isn't much of a benchmark. And of course if I run it with kotlin-js it actually ends up using promises. So, it's not going to be any better there than on the JVM.Re: How much memory do you need in 2024 to run 1M concurrent tasks?
#118Re: How much memory do you need in 2024 to run 1M concurrent tasks?
#119Earlier quoted context omitted.
> Is that the ideomatic way to do it Well... I'm actually not sure what ideomatic means (English isn't my first language), but it's the standard way of doing it. You'll even find it as step 2 and 3 here: https://go.dev/tour/concurrency/1 > or the best way you can imagine I would do a lot much more to tune it if you were in a position where you'd know it would run that many "tasks". I think what many non-Go programmer…
I'm torn. As far as practicality goes I actually agree with you: if I knew I were trying to do something to the order of 1,000,000 tasks in Go I would probably use a worker pool for this exact reason. I have done this pattern in Go. It is certainly not unidiomatic. However, it also isn't the obvious way to do 1,000,000 things concurrently in Go. The obvious way to do 1,000,000 things concurrently in Go is to do a for…
> I'll tell you what this benchmark tells me really though: C# is seriously impressive.
The C# team has done some really great work in recent years. I personally hate working with it and it's "magic", but it's certainly in a very good place as far as trusting the CLR to "just work".
Hilariously I also found the Python benchmark to be rather impressive. I was expecting much worse. Not knowing Python well enough, however, makes it hard to really "trust" the benchmark. A talented Python team might be capable of reducing memory usage as much as following every step of the Go concurrency tour would for Go.
Re: How much memory do you need in 2024 to run 1M concurrent tasks?
#120While it’s nice to compare languages with simple idiomatic code I think it’s unfair to developers to show them the performance of an entirely empty function body and graphs with bars that focus on only one variable. It paints a picture that you can safely pick language X because it had the smaller bar. I urge anyone making decisions from looking at these graphs to run this benchmark themselves and add two things: - A…