Skip to content

Functions written in expression style are slower than imperative style #1528

Closed
@brson

Description

@brson

This takes 4.7s:

use std;                                                                                                                                                                      

fn ack(m: int, n: int) -> int {                                                                                                                                               
    if m == 0 {                                                                                                                                                               
        ret n + 1                                                                                                                                                             
    } else {                                                                                                                                                                  
        if n == 0 {                                                                                                                                                           
            ret ack(m - 1, 1)                                                                                                                                                 
        } else {                                                                                                                                                              
            ret ack(m - 1, ack(m, n - 1));                                                                                                                                    
        }                                                                                                                                                                     
    }                                                                                                                                                                         
}                                                                                                                                                                             

fn main(args: [str]) {                                                                                                                                                        
    // FIXME: #1527                                                                                                                                                           
    sys::set_min_stack(1000000u);                                                                                                                                             
    let n = if vec::len(args) == 2u {                                                                                                                                         
        int::from_str(args[1])                                                                                                                                                
    } else {                                                                                                                                                                  
        12                                                                                                                                                                    
    };                                                                                                                                                                        
    std::io::println(#fmt("Ack(3,%d): %d\n", n, ack(3, n)));                                                                                                                  
}      

This takes 5.5s:

use std;                                                                                                                                                                      

fn ack(m: int, n: int) -> int {                                                                                                                                               
    if m == 0 {                                                                                                                                                               
        n + 1                                                                                                                                                                 
    } else {                                                                                                                                                                  
        if n == 0 {                                                                                                                                                           
            ack(m - 1, 1)                                                                                                                                                     
        } else {                                                                                                                                                              
            ack(m - 1, ack(m, n - 1))                                                                                                                                         
        }                                                                                                                                                                     
    }                                                                                                                                                                         
}                                                                                                                                                                             

fn main(args: [str]) {                                                                                                                                                        
    // FIXME: #1527                                                                                                                                                           
    sys::set_min_stack(1000000u);                                                                                                                                             
    let n = if vec::len(args) == 2u {                                                                                                                                         
        int::from_str(args[1])                                                                                                                                                
    } else {                                                                                                                                                                  
        12                                                                                                                                                                    
    };                                                                                                                                                                        
    std::io::println(#fmt("Ack(3,%d): %d\n", n, ack(3, n)));                                                                                                                  
}                            

Metadata

Metadata

Assignees

No one assigned

    Labels

    I-slowIssue: Problems and improvements with respect to performance of generated code.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions