There's lots of things that could be done in terms of clever optimizations,
but currently this is how it is. If you want C speed, concretely type your
fields. For flexibility, this can sometimes entail having type parameters.

On Sat, May 14, 2016 at 1:52 PM, Ford Ox <[email protected]> wrote:

> Interesting.
>
> The compiler can't use the same hack it uses for multiple dispatch to
> generate multiple versions of types and then use only some of them?
>
> 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]> 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