Truly @nogc Exceptions?

Adam D. Ruppe destructionator at gmail.com
Thu Sep 20 17:58:40 UTC 2018


On Thursday, 20 September 2018 at 17:14:12 UTC, Steven 
Schveighoffer wrote:
> I don't know how a performance problem can occur on an error 
> being thrown anyway -- the process is about to end.

Walter's objection was code size - it would throw stuff out of 
cache lines, even if it doesn't need to actually run.

So like this line:

int[] a;
a = a[1 .. $];

With no bounds checking is just

inc a.ptr;

but with bounds checking it becomes something more like

mov ecx, a.length
cmp ecx, 1 // in other words, if length >= offset
jae proceed
push line
push file
call d_arraybounds // throws the error
proceed:
inc a.ptr


Now, what my patch did was just, right before push line, it 
inserted "push length; push offset;". I believe this to be 
trivial since they are already loaded in registers or immediates 
and thus just a couple bytes for those instructions, but Walter 
(as I recall, this was a while ago and I didn't look up his exact 
words when writing this) said even a couple bytes are important 
for such a common operation as it throws off the L1 caches. I 
never got around to actually measuring the performance impact to 
prove one way or another.

But... even if that is a problem, dmd -O will usually rearrange 
that to avoid the jump on the in-bounds case, and I'm sure 
ldc/gdc do too, sooooo the extra pushes' instruction bytes are 
off the main execution path anyway and thus shouldn't waste cache 
space.


idk though. regardless, to me, the extra info is *well* worth the 
cost anyway.


More information about the Digitalmars-d mailing list