Are they declared as `const`? They appear to be assigned to in the middle
of this. It's not the act of changing them that makes the code slow, it's
the possibility.

On Fri, Oct 17, 2014 at 6:26 PM, alexander maznev <
[email protected]> wrote:

> No, they should be constant. RANDSIZL is always 8 (unless one were using
> non-ub8 types in the mm/randrsl arrays), RANDSIZ is the length of
> seed/output array, generally 256, but it should work with any multiple of
> 8.
>
> I presume using m[i], r[i], i+=1 rather than *(m++),  *(r++) is slower,
> but it should not be this kind of magnitude. I will play around with it a
> bit more.
>
> On Friday, October 17, 2014 4:58:35 PM UTC-4, alexander maznev wrote:
>>
>> I was trying out Julia for the first time and did not seem to find a
>> CSPRNG available. Below is a port of Isaac64 (
>> http://burtleburtle.net/bob/rand/isaacafa.html). My runtime
>> meassurements seem to be very poor - reading a little bit about Julia prior
>> to trying the language, and especially looking at the benchmarks I was
>> under the impression that run times should be relatively comparable with C.
>> Would appreciate some feedback, thanks.
>>
>>
>> function main(randrsl::Array{Uint64}=Uint64[]) #takes Uint64 array as a
>> seed
>> #wrap everything to pass variables into sub-scopes implicitly
>>     function isaac64()
>>         function ind(mm,x)                #nesting ind() into rngstep
>> makes it another 2-3 times slower -!
>>             return mm[int((x & ((RANDSIZ-1)<<3))/8)+1]
>>         end
>>         function rngstep(a_mix,m1,m2,r)
>>             x = mm[m1+i]
>>             a = (a_mix) + mm[m2+i]
>>             mm[m1+i] = y = (ind(mm, x) + a + b)
>>             randrsl[r+i] = b = (ind(mm, y>>RANDSIZL) + x)
>>             i+=1
>>         end
>>         a=aa; cc+=1; b=bb+cc; x=0x0000000000::Uint64;
>>         m1=r=0;mid=m2=int(RANDSIZ/2); i=1;
>>         while (i < (mid-2)) #do it without pointers
>>             rngstep(~(a$(a<<21)), m1, m2, r) #sub-indexing an array
>> creates a new object, pass indexes as variables
>>             rngstep(a$(a>>5), m1, m2, r)
>>             rngstep(a$(a<<12), m1, m2, r)
>>             rngstep(a$(a>>33), m1, m2, r)
>>         end
>>         i=1; m2=0; r=m1=(RANDSIZ/2);
>>         while (i<(mid-2))
>>             rngstep(~(a$(a<<21)),m1, m2, r)
>>             rngstep(a$(a>>5), m1, m2, r)
>>             rngstep(a$(a<<12), m1, m2, r)
>>             rngstep(a$(a>>33), m1, m2, r)
>>         end
>>         bb = b; aa=a;
>>     end
>>
>>     function randinit(flag=false)
>>         function mix!()
>>             a-=e; f$=h>>9; h+=a;    #$ for bitwise xor
>>             b-=f; g$=a<<9;  a+=b;    #glad they didn't remove semi-columns
>>             c-=g; h$=b>>23; b+=c;
>>             d-=h; a$=c<<15; c+=d;
>>             e-=a; b$=d>>14; d+=e;
>>             f-=b; c$=e<<20; e+=f;
>>             g-=c; d$=f>>17; f+=g;
>>             h-=d; e$=g<<14; g+=h;
>>         end
>>         a=b=c=d=e=f=g=h= 0x9e3779b97f4a7c13::Uint64
>>         for i in range(1,4)
>>             mix!()
>>         end
>>         for i in range(1,8, int(RANDSIZ/8)) #dividing 256/8 produced a
>> float
>>             if flag
>>                 a+= randrsl[i ]; b+=randrsl[i+1]; c+=randrsl[i+2];
>> d+=randrsl[i+3];
>>                 e+=randrsl[i+4]; f+=randrsl[i+5]; g+=randrsl[i+6];
>> h+=randrsl[i+7];
>>             end
>>             mix!()
>>             mm[i  ]=a; mm[i+1]=b; mm[i+2]=c; mm[i+3]=d;
>>             mm[i+4]=e; mm[i+5]=f; mm[i+6]=g; mm[i+7]=h;
>>         end
>>         if flag
>>             for i in range(1,8, int(RANDSIZ/8))
>>                 a+=mm[i  ]; b+=mm[i+1]; c+=mm[i+2]; d+=mm[i+3];
>>                 e+=mm[i+4]; f+=mm[i+5]; g+=mm[i+6]; h+=mm[i+7];
>>             mix!()
>>                 mm[i  ]=a; mm[i+1]=b; mm[i+2]=c; mm[i+3]=d;
>>                 mm[i+4]=e; mm[i+5]=f; mm[i+6]=g; mm[i+7]=h;
>>             end
>>         end
>>             isaac64()
>>             randcnt=RANDSIZ
>>     end
>>     #main scope variables
>>     RANDSIZL=8; RANDSIZ = length(randrsl); #add a function to allow
>> 32byte input array
>>     if RANDSIZ == 0
>>         RANDSIZ = 256
>>         for i in range(1,RANDSIZ)
>>             push!(randrsl, 0)
>>         end                    #end statement for each conditional
>>     elseif RANDSIZ % 8 != 0            # would have prefered elif
>>         error("dimension of seeding array must be a factor of 8")
>>     end
>>     aa=bb=cc=0x0000000000::Uint64  #really won't take 0::Uint64 ?
>>     mm=Uint64[]
>>     for i in range(1,RANDSIZ) #indexes start with 1
>>         push!(mm, 0)
>>     end
>>     randinit(true)
>>     for i in range(1,2)
>>         isaac64()
>>         for j in range(1,RANDSIZ)
>>             @printf("%llx",randrsl[j]) #@printf for c string formatting
>>         end
>>     end
>> end
>> function timeit(f, n=10^4)
>>     t = time()
>>     for i in range(1,n)
>>         f()
>>     end
>>     @printf("avg running time: %llf \n", ((time() -t) / n ))
>>     end
>> timeit(main)
>>
>

Reply via email to