New linked list
Sean Kelly
sean at f4.ca
Thu May 11 16:38:55 PDT 2006
You know, this whole sequence optimization business seems to be linked
to mutability: if no mutating operations are performed then optimize
away! Unfortunately, I haven't seen a high-level construct for method
classification that can't be violated by the user. And while this may
be irritating in some cases, it could lead to nasty bugs in the face of
such optimizations. In some respects, it would be nice if each
operation in the language could be labeled as mutating or non-mutating
and then functions could be analyzed for atomicity during compilation,
so a function would considered atomic if it does not perform a mutating
operation on non-local data. But this may be overly restrictive. For
example, the body of a foreach loop must be able to perform some
mutating operations, but different categorites would impose different
restrictions on optimization:
int sum = 0;
foreach( int val; values ) {
sum += val;
}
Here, the code could be heavily parallelized because the result doesn't
depend on the sequence in which operations are performed. However:
foreach( int val; values ) {
printf( "val: %d\n", val );
}
Here, the code could be optimized somewhat but must still be executed
sequentially. By comparison:
void fn() {
values ~= 5;
}
foreach( int val; values ) {
if( val > 10 ) fn();
}
No optimizations may be performed here because the iteration sequence is
being modified during processing. To make matters worse, this could
occur through an untraceable sequence of pointers and such that the
compiler can't make sense of. What would be wonderful is if there were
a way to distinguish these three categories of code somehow. I know,
that's the million dollar question, but I harbor a secret hope that if
it's asked frequently enough then perhaps someone will think of an answer.
Sean
More information about the Digitalmars-d-announce
mailing list