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