How to make Lisp go faster than C (2006) [pdf]
iaeng.org
iaeng.org
Piumarta, Ian, and Alessandro Warth. “Open, Extensible Object Models,” 2007. https://piumarta.com/software/cola/objmodel2.pdf
> This shows that an extensible, object-based implementation can perform at [not even twice as slow as] a typical C implementation for a simple language primitive. With a global method cache (constant overhead, no matter how many method invocation sites exist) the performance is within 10% of optimised C. When the inline cache was enabled the performance was [twice as fast as] optimised C.
typedef struct {
int a;
int b[10];
} foo;
Then the following will (likely) work: foo f;
f.a = -1;
printf("%d\n", f.b[-1]); // => -1
In fact, the following also works: f.b[0] = 10;
printf("%d\n",(&(f.a))[1]); // => 10
C is very flexible in allowing you to do what you want with addresses (once obtained). But yes, if you don't control it then it is likely going to be garbage data.Thanks, that part is clear. I guess in the Piumarta paper, he's assuming all of these objects are contiguous in memory? Because the vtable pointer is always to [-1] but it's not specified in any given struct...
function vtable_allocate(self, size) =
let object = allocateMemory(PointerSize + size)
object := object + PointerSize
object[-1] := self
return object
This will guarantee that the memory is contiguous and properly allocated to the process so it's not using garbage data.It's a fun paper that does a good job at presenting a the first few steps worth taking towards implementing well performing dynamic object models and showing that it may be worth considering those methods when writing C that requires different behaviour for different data structures over writing static code in those specific cases, but people have been writing vtable based object models for C "forever" that solves enough of those problems that it's rarely worth going the extra mile to get the dynamic model they present in the paper.
When you actually need it, it's very useful to know these tricks, though, and for those unfamiliar with dynamic object models it's a great introduction.
That said, it does miss one other simple trick that's worth considering. For inheritance it searches parents, and this is a large part of what makes the "bind" expensive and so makes the inline caching worthwhile.
Protocol extension [1] provides a way to do this which can be implemented either as cheap as vtables for calls (costs more memory) or one indirect load more expensive (more space efficient). Basically the fastest approach is to make all vtables big enough to accommodate individual slots for each method name. The "slow" approach groups methods in interfaces and gives you a "vtable of vtables". Couple that with a simple method propagation algorithm that lets you override methods like in this paper but respects sub-classes overriding a method (by seeing if the pointer to the function implementing the method matches that in the parent vtable), and that's it.
You might think this blows up really badly. But in practice in experimenting with in-progress-and-may-never-be-finished Ruby compiler, the memory overhead tends to be surprisingly small - few projects have large enough number of classes and large enough numbers of unique method names for it to be a major issue, but the two approaches can also be combined with fallback to more indirection). Even with a singly-rooted object hierarchy like Ruby it doesn't seem likely to be a big problem, and for a language implementation you can "mix and match" and put the most common method names in a shared vtable and fall back to more expensive lookup methods for less common methods if necessary to save memory.
The main benefit comes with megamorphic call-sites (places where the vtable used for the call will frequently change at any given call-site, and where you thus otherwise end up falling back to the expensive method lookup very often), which is no more expensive than monomorphic call-sites with protocol extension.
[1] Protocol Extension: A Technique for Structuring Large Extensible Software-Systems, 1995, Michael Franz https://www.semanticscholar.org/paper/Protocol-Extension%3A-...
https://en.m.wikipedia.org/wiki/Restrict
But yes, Fortran can be as fast, although I'm not sure compilers are given the same love as in C
How to make Lisp go faster than C [pdf] - https://news.ycombinator.com/item?id=1390944 - May 2010 (15 comments)
How to make Lisp go faster than C - https://news.ycombinator.com/item?id=491057 - Feb 2009 (2 comments)
How to Make Common Lisp go Faster Than C - https://news.ycombinator.com/item?id=195067 - May 2008 (42 comments)
How to make Lisp go faster than C - https://news.ycombinator.com/item?id=172432 - April 2008 (16 comments)
The PDF seems fine though. I really hate the trend of "not downloaded much" = "probably bad"
I've seen many interesting submissions about Java or C# - arguably much more popular languages; unlike with Lisp most of those we'll never see on the front page.
Why is HN so biased towards this one language. Can we please give other topics the same treatment?
So yeah, the Lisp love here goes deep.
https://hn.algolia.com/?dateRange=pastMonth&page=0&prefix=fa...
Java’s slowly become an acceptable language for mixed-skill teams but I don’t think there’s a lot of exciting news about it at least until Project Loom finally lands. I don’t know what would put C# onto more teams’ radar now that they announced feature completeness on Linux.
https://medium.com/hacking-and-gonzo/how-hacker-news-ranking...
Fair warning, it's written in Lisp.
But, how would one be able to provide any sort of evidence of this happening without being moderator yourself?
If the moderators are more or less like the readers, I guess it is no extra skew.
>"You can help the spike subside by making HN look extra boring. For the next couple days it would be better to have posts about the innards of Erlang"
https://news.ycombinator.com/item?id=512145 ("Why HN is slow lately", by pg)
(Reading the erlang stuff with gusto now)
Personally I'm in favor of removing "downvote to oblivion" because it degrades my experience of using HN.