8 ms·
Reducing Memory Usage in Ruby
- sam0x17 9y agoOr just use Crystal https://crystal-lang.org https://crystal-lang.org XD
- igravious 9y agoCrystal is not a replacement for Ruby. In the same way that many Algol-like languages are not a straight swap for each other. Don't get me wrong, Crystal is a nice idea but say goodbye to all that yummy Ruby meta-programming which is one of the key things what makes the language so appealing in the first place.
- eropple 9y agoExactly. As a Ruby developer, Crystal makes me itch. It jettisons exactly what Ruby is valuable to me for: quickly and dynamically building fluent-feeling libraries and tools. It's fast, but I don't need fast--if I don't need Ruby's metaprogramming, I have other, better, established languages to use for those tasks. (Kotlin, C#, Rust, whatever.) Elixir is kind-of in the same boat for me. I think it's neat and has its place, and BEAM is really cool, but it doesn't scratch the Ruby itch for me. I just don't care about it looking vaguely like Ruby if it's not actually gonna be Ruby.
- dragonwriter 9y agoElixir is, in my view, an even-more-awesome Erlang with an unfortunate and distracting cosmetic resemblance to Ruby. Ruby is awesome, as is Elixir, but very different awesome.
- eropple 9y agoAgreed, to be clear. I think Elixir is cool. It just keeps getting framed as a "better Ruby"--though Phoenix might be (probably is) a better Rails.
- sam0x17 9y agoHave you used a recent (2017) version of Crystal? Quickly building fluent-feeling libraries and tools is exactly my use case for Crystal. For me, everything that Ruby is valuable for is retained. I'm able to do all the things I did in Ruby just fine, and it prevents me from doing a lot of things I shouldn't have been doing. We recently migrated our app from Rails to Crystal (using the Amber framework) and our code base is now 2/3rds the size and we eliminated hundreds of bugs in the process simply from static typing and explicit nil handling. Our response times are also now all under 30ms where we were at 100ms+ before.
- eropple 9y agoUntil I can perform runtime define_method calls and dynamically construct classes, it doesn't matter what Crystal does. It's fundamentally antithetical to my needs. (JavaScript isn't, but JavaScript is kind of clunky.) I have Kotlin, C#, C++, and Rust if I need static typing. Ruby is for when I don't.
- yorwba 9y agoHow late at runtime do these dynamic definitions need to be possible? Just at startup or also after the program has been running for a while? I occasionally wonder whether it might be possible to accommodate more dynamic language features with a compiler that treats them like a macro system that is expanded statically, such that no actual dynamicism is necessary at runtime.
- sam0x17 9y agoThis is exactly what crystal does
- sam0x17 9y agoYou can do all of that with really easy to write crystal macros.
- eropple 9y ago
- sam0x17 9y agoTake a look at macros in crystal and I promise you 99% of the time you will be able to do what you did in Ruby. Practically everything people do that is "necessarily dynamic" could be done with macros at compile-time. You CAN do things like define the behavior for when a method name is unmatched on an Object or (at compile time) do some string processing and define a bunch of methods based on the results.
- pankajdoharey 9y agoMeta-programming in Crystal exists through Macros.
- igravious 9y agoWhat I'd like to be able to do is load ActiveRecord (or any other v. heavy lib) asynchronously in non web-based apps so that I can paint the UI quicker. By the time the user will do/need anything db-related a proxy object should be swapped out for an actual ActiveRecord object. Using Rails' ORM is so nice and ergonomic but it kills start-up time with all the file requires, Bootsnap helps a bit but I'd prefer not to have to use it as it is yet one other moving part to consider.
- AznHisoka 9y agoI am actually facing a similar problem. I also find that Rails just creates a db connection everytime I do Model.new even though I have not yet saved it.
- amichal 9y agoThis is because active record models learn their attributes by querying the database scheme. I haven’t tried it but there appears to be a way to cache this information in the local file system which would likely avoid the early dB connect if you really needed to do that. Also avoids querying the scheme on processs boot entirely if you are willing to trust the cached scheme matches the. database scheme. See https://github.com/rails/rails/issues/24133 https://github.com/rails/rails/issues/24133 for discussion
- stouset 9y agoI don’t quite understand why this is a problem. You pay the ActiveRecord boot time once, at app start, and then it’s no longer an issue.
- ad_hominem 9y agoThis is orthogonal to tenderlove's GC work, but if you're using MRI and want an easy memory usage/performance win, swap out the standard glibc malloc for jemalloc: https://www.levups.com/en/blog/2017/optimize_ruby_memory_usage_jemalloc_heroku_scalingo.html https://www.levups.com/en/blog/2017/optimize_ruby_memory_usa...
- johncolanduoni 9y agoKind of a tangent, but does anyone know why glibc’s allocator loses to jemalloc on common workloads? I would expect that would be something worth rectifying unless other requirements tie their hands.
- __s 9y agoQuite a few complaints about jemalloc from Rust, where people wonder about higher than necessary memory usage jemalloc likely wins more for the kinds of allocations you find in scripting language runtimes, which also happens to be similar to a browser given DOM & JS See also: https://sourceware.org/glibc/wiki/389-ds-malloc https://sourceware.org/glibc/wiki/389-ds-malloc
- masklinn 9y ago> Kind of a tangent, but does anyone know why glibc’s allocator loses to jemalloc on common workloads? Jemalloc implements more complex strategies (per-thread caches learned from tcmalloc, preallocated arenas, …). It tends to have a somewhat higher memory use than simpler allocators, but have faster throughput and less fragmentation (the latter is why Firefox switched to jemalloc by default IIRC). > I would expect that would be something worth rectifying unless other requirements tie their hands. Why? If they consider ptmalloc good enough for their purpose, replacing it would be very low priority, and they may value e.g. code simplicity higher. Incidentally, there was talk at one point to replace glibc's ptmalloc: https://sourceware.org/ml/libc-alpha/2014-10/msg00419.html https://sourceware.org/ml/libc-alpha/2014-10/msg00419.html
- kawsper 9y agoI am so happy that Github have hired Tenderlove to go nuts with these type of projects. His talks are always extremely fun and interesting. I run Ruby with jemalloc, and I know that samsaffron have tried to include it within the Ruby releases (like Redis does), but progress seems to have been stalled https://bugs.ruby-lang.org/issues/9113 https://bugs.ruby-lang.org/issues/9113
- farnsworthy 9y agoI thought he was nuts already. (Smiley thing here.)
- wcr3 9y agoa curative, but not preventative, linear-time solution: 1. if usage of ruby = 0, halt. 2. reduce usage of ruby and return to step (1).
- hirundo 9y agoRuby seems to have a footprint on Hacker News disproportionate to its general popularity and TIOBE index. Why?
- berfarah 9y agoRuby has one of the better communities among programming languages - disproportionate to its popularity. I wish more languages had that quality of discourse.
- lstamour 9y agoRails, and possibly 37signals, was very influential to many folks about a decade ago, especially in the startup community, where Rails was seen as especially useful for prototyping or rapid, test-driven web app development. https://www.quora.com/Why-do-so-many-startups-use-Ruby-on-Rails https://www.quora.com/Why-do-so-many-startups-use-Ruby-on-Ra... It’s popularity at this may have diminished with the rise of JavaScript, Go and alternatives but many folks still like and use Ruby, or at least would like to see it continue to improve and thrive.
- farnsworthy 9y agoFrom a different perspective, having worked on numerous Ruby projects for years across the private (startups to Fortune 500), nonprofit, and government sectors, spanning many locations with worldwide team members, I don’t see where Ruby/Rails isn't at this point—it’s seemingly all-pervasive. Similar to general hiring/salary surveys, I’m not sure that the referenced index is accurate.
- abhiyerra 9y agoRuby and Rails have been around for about 10 years at this point. It is stable and for most websites it just works (up to a certain size). It is not as exciting as JS is now but people are using it to get things done since it is relatively mature and used a lot in startups. Likely why you see it referenced a lot here.
- mwaitjmp 9y agoNot only due to the popularity of Rails, Ruby has become popular for sysadmins as config management solutions such as puppet and chef are built on top of it. The resulting syntax is very ruby like, and in some cases you are even required to write a few ruby blocks here and there. It also has an amazing testing framework in the form of rspec, which can be used for much more than just testing Ruby code.
- sandGorgon 9y agoWhat I'm really keen to see is truffleruby receiving a lot of community support. The underlying JVM and the Truffle/Graal/SubstrateVM is the product of millions of man hours of research - and for the very first time, you have a compiler framework on top of that. The Truffle framework also brings in a lot of support that all languages get for free, like zero overhead profiling https://twitter.com/nirvdrum/status/948333404122214401 https://twitter.com/nirvdrum/status/948333404122214401 Truffleruby is already in the running in benchmarks, and it will be awesome to see how far it can be pushed . http://nirvdrum.com/2017/02/15/truffleruby-on-the-substrate-vm.html http://nirvdrum.com/2017/02/15/truffleruby-on-the-substrate-...
- ksec 9y agoThe major obstacle right now is C extension, which I think Sulong [1] is suppose to solve. It seems right now, TruffleRuby 99% of Ruby code without much problem. C Extension may be the key to wide spread adoption. [1] https://github.com/graalvm/sulong https://github.com/graalvm/sulong
- crb002 9y agoIs there any effort to make WASM run under Ruby? Seems like easy work to get high performance without bespoke work on Ruby's VM.