
Small Memory Software: Patterns for systems with limited memory - ingve
http://www.smallmemory.com/book.html
======
userbinator
The one thing that I was strongly expecting but didn't seem to find any
mention of when I was quickly paging through is the idea of using simpler,
constant-space algorithms (e.g. streaming style, keeping only what's needed in
memory) and in general _reducing the amount of code and data_.

Likewise, the use of C++ and Java in a book about "limited memory" is a bit
unusual.

Then again, I'm _really_ not keen on the whole "patterns" thing, because from
experience I've found it tends to replace careful thought with dogmatic
application of rules that might not be relevant at all to the situation at
hand.

~~~
viraptor
Why is C++ not good? It doesn't grow memory usage on its own. If you can put C
code on something, you can do C++ as well. We're talking about things up to 10
MB. It's perfectly fine on those. (actually the smaller your target, the less
difference there is - you don't really have to care about APIs or calling
conventions on an 8K chip)

Java has many different versions. For example the smallest one (JavaCard) can
run on tiny chips in smartcards, so Java as a whole may be a bad
generalisation, but it's definitely possible.

~~~
adrianratnapala
You can write C++ code that works like an equivalent C program, but that code
also looks like the equivalent C program -- only with slightly less modern
syntax.

Writing good, modern C++ means using the external template libraries and all
kinds of (relatively) heavyweight goodies. The trouble is it's difficult to
predict the space cost of those goodies -- so on systems where that matters
it's just easier to think in terms of C.

~~~
Sanddancer
Regardless of if you're coding in C or C++ for micros, you're not going to be
using much, if any, of the standard library anyways. You'll probably be
rolling your own routines for a lot of stuff because so many libraries, even
those for micros, are rather oversized for when you're truly constrained.

I've used templates in C++ libraries for the purposes of varying memory
constraints and mcu capabilities. Being able to write a library once and
deploy it on 8 bit and 32 bit chips without FPUs and chips with fpus means
saving a lot of time, and it writes code that's just as efficient. Finally, a
lot of C/C++ compilers for small devices have routines to give a pretty good
guess as to how much RAM your code's going to need, so you can figure out
ahead of time if a routine is really worth it.

------
ChuckMcM
I realize that small memory discipline is not something that serves a modern
programmer well. Spending time on optimizing memory usage is often completely
useless as a new version or new feature will invalidate the effort and the
overall effect on the system, compared to other work the programmer could be
doing, would not be cost effective.

That said, understanding how to design in tight memory constraints is useful.
While typically only seriously practiced by embedded systems developers,
having habits that minimize memory use can have a large impact at scale. The
paper gives some good reasons on what the benefits of those habits are, but I
also think that, as a percentage of the total, programmers living in
constrained memory spaces are a specialization not the mainstream any more.

~~~
awinter-py
We're not living in constrained memory spaces on desktop but we sometimes are
in the cloud.

In my experience 'small-batch distributed jobs' (~5 machines) are often
candidates for memory optimization. Especially if written in high-level
languages without easy access to struct packing.

~~~
Lerc
I think we _are_ living in memory constrained spaces on the desktop. For some
time now I have found the impetus for upgrading to a new computer has been to
gain more RAM. More RAM usually requires changing RAM/DIMM type which
necessitates new Motherboard and therefore new CPU. It has been that way since
I had a 8 Meg machine.

It boggles me that a machine that could hold six hundred uncompressed 1080p
video frames is my most memory constrained computer.

~~~
0xffff2
For what it's worth, I've had the opposite experience throughout my life. I've
never actually upgraded to the physical/motherboard memory limits before I end
up buying a new motherboard anyway when changing CPU sockets.

------
fiatjaf
At least this serves to remind people they must think about memory, at least
sometimes. The rule today seems to be to use as much memory as possible, load
gigantic frameworks or use super-heavy languages for the most simple of tasks.
I only notice because my computer do not have all the memory a normal modern
computer has.

~~~
vmorgulis
How many memory does your computer have?

I run Gnome and Debian. I looked a bit at the System Monitor. All the standard
unix tools (like cron...) are tiny. They only use few Kb. They big consumers
are gui related and the heaviest is Firefox with 500 Mb. I have 4Gb of ram.

~~~
fiatjaf
I have 1GB, but yes, all system tools are tiny. Browsers are heavy. Chrome was
very light until some time ago, but now it is as heavy as Firefox.

Some webpages are use a hell lot of memory.

But there are big problems with webapps, too. For example, there are small
apps that do super basic things and that can't be run on a Heroku free dyno.
Mainly those written with Ruby on Rails, I guess -- like Discourse, and other
small apps I've seen, but I've seen others.

~~~
mkesper
Have a look at ublock vs adblock plus comparison featured yesterday:
[https://news.ycombinator.com/item?id=11277135](https://news.ycombinator.com/item?id=11277135)

------
jdcarter
I've owned the print version of this book for many years; it's like the GoF
book for embedded systems. Solid material presented very well. Kudos to the
authors for releasing the PDFs!

------
jschwartzi
Chapter 2 is basically a textbook description of how Android handles memory.

