Fixed. Julia now takes 11 seconds to finish
type Tokenizer
    tokens::Array{AbstractString, 1}
    index::Int
    Tokenizer(s::AbstractString) = new(split(strip(s)), 0)
end

type Buffer
    stream::IOStream
    tokenizer::Tokenizer
    Buffer(stream) = new(stream, Tokenizer(""))
end



Dne sobota 14. května 2016 13:39:24 UTC+2 Stefan Karpinski napsal(a):
>
> Your types have totally untyped fields – the compiler has to emit very 
> pessimistic code about this. Rule of thumb: locations (fields, collections) 
> should be as concretely typed as possible; parameters don't need to be.
>
> On Sat, May 14, 2016 at 1:36 PM, Ford Ox <[email protected] <javascript:>> 
> wrote:
>
>> I have written exact same code in java and julia for reading integers 
>> from file. 
>> Julia code was A LOT slower. (12 seconds vs 1.16 seconds)
>>
>> import Base.isempty, Base.close
>>
>> ##    Tokenizer ##
>>
>> type Tokenizer
>>     tokens
>>     index
>>     Tokenizer(s::AbstractString) = new(split(strip(s)), 0)
>> end
>>
>> isempty(t::Tokenizer) = length(t.tokens) == t.index
>>
>> function next!(t::Tokenizer)
>>     t.index += 1
>>     t.tokens[t.index]
>> end
>>
>> ## Buffer ##
>>
>> type Buffer
>>     stream
>>     tokenizer
>>     Buffer(stream) = new(stream, [])
>> end
>>
>> function next!(b::Buffer)
>>     if isempty(b.tokenizer)
>>         b.tokenizer = Tokenizer(readline(b.stream))
>>     end
>>     next!(b.tokenizer)
>> end
>>
>> close!(b::Buffer) = close(b.stream)
>> nexttype!(t, b::Buffer) = parse(t, next!(b))
>> nextint!(b::Buffer) = nexttype!(Int, b)
>>
>> cd("pathToMyFile")
>> b = Buffer(open("File"))
>>
>> function readall!(b::Buffer)
>>     for _ in 1:nextint!(b)
>>         nextint!(b)
>>     end
>>     close!(b)
>> end
>>
>> @time readall!(b)
>>
>>
>> 12.314114 seconds (84.84 M allocations: 3.793 GB, 11.47% gc time)
>>>
>>
>> package alg;
>>
>> import java.io.*;
>> import java.util.StringTokenizer;
>>
>> public class Try {
>>     StringTokenizer tokenizer;
>>     BufferedReader reader;
>>
>>     public static void main(String[] args) throws IOException {
>>         String name = "fileName";
>>         Try reader = new Try(new File(name));
>>
>>         long itime = System.nanoTime();
>>         int N = reader.nextInt();
>>         for(int n=0; n < N; n++)
>>             reader.nextInt();
>>         System.out.println((double) (System.nanoTime() - itime) / 
>> 1000000000);
>>
>>     }
>>
>>     Try(File f) throws FileNotFoundException {
>>         tokenizer = new StringTokenizer("");
>>         reader = new BufferedReader(new FileReader(f));
>>     }
>>
>>     String next() throws IOException {
>>         if(!tokenizer.hasMoreTokens()) tokenize();
>>         return tokenizer.nextToken();
>>     }
>>
>>     void tokenize() throws IOException {
>>         tokenizer = new StringTokenizer(reader.readLine());
>>     }
>>
>>     int nextInt() throws IOException {
>>         return Integer.parseInt(next());
>>     }
>> }
>>
>>  1.169884868
>>
>>  
>> The file has 7 068 650 lines. On each line is one integer that is not 
>> bigger than 2^16.
>>
>
>

Reply via email to