Differentiate const flavors using CASE?

Bruno Medeiros brunodomedeiros+spam at com.gmail
Fri Mar 23 14:06:24 PDT 2007


Oskar Linde wrote:
> janderson skrev:
> 
>> Walter posted about this in another thread saying foreach_reverse was 
>> that way because of some performance nitch.
> 
> That's right. The DMD compiler isn't able to inline functions containing 
> loops. Also, it is unable to inline calls to compile time known const 
> (invariant?) delegates. Instead of fixing that, a new special case 
> keyword is introduced.
> 
>> I still think that foreach_reverse is not the right way to do a 
>> reverse.  I think having it as a member or free function is the best.
> 
> I Agree.
> 
>> The compiler should be able to detect .reverses on primitive arrays 
>> and optimize them.
> 
> Or even better, fix the compiler issues with inlining. Here is a trivial 
> reverse array viewer I've been using since long before foreach_reverse 
> was introduced. It doesn't perform extremely well for the above 
> mentioned reasons, but I've always been thinking that one day a decent 
> compiler would generate close to optimal code out of this.
> 
> struct ReverseIterator(T:T[]) {
>         T[] array;
> 
>         int opApply(int delegate(inout T) dg) {
>                 for (int i = array.length-1; i >= 0; i--) {
>                         if (auto status = dg(array[i]))
>                                 return status;
>                 }
>                 return 0;
>         }
> }
> 
> ReverseIterator!(Array) reverseView(Array)(Array array) {
>         ReverseIterator!(Array) iter = {array};
>         return iter;
> }
> 
> import std.stdio;
> void main() {
>         foreach(x; reverseView("abcdx"))
>                 writefln("%s",x);
> }
> 
>> Besides, how does the compiler currently optimize something written as 
>> an opApply?
> 
> It doesn't.
> 
> The introduction of foreach_reverse resolved the above mentioned 
> performance issue with iterating backwards over an array, but didn't 
> resolve either:
> 
> * Iterating backwards over any other container/view that implements 
> random access semantics.
> 
> * Efficiently implementing other view constructs, such as:
> 
> foreach(person; employees.select((Person p){ return p.age > 65; }))
> 
> foreach(t; str.tokenize(" "))
> 
> foreach(d; data.selectIndices(indexArray))
> 
> etc...
> 
> foreach_reverse doesn't generalize anything. A container that implements 
> random access semantics will not automatically be foreach_reversible. 
> Everyone wanting to make a standard container will have to implement a 
> silly opApplyReverse method that serves no real use. The performance 
> will not be any better than using a generic reverse viewer and this was 
> the only argument for adding foreach_reverse.
> 
> IMHO, foreach_reverse is an aberration in so many ways and the sooner it 
> is gone the better.
> 
> /Oskar

Very well said, I subscribe fully.

-- 
Bruno Medeiros - MSc in CS/E student
http://www.prowiki.org/wiki4d/wiki.cgi?BrunoMedeiros#D



More information about the Digitalmars-d mailing list