What kind of optimizations does the Unicon compiler have?

> On Apr 11, 2017, at 12:26 AM, Don Ward <d...@careful.co.uk> wrote:
> 
> Just a thought:  Is the compiler clever enough to optimise away the trapped 
> variable? It has enough information in principle.
> 
>> On 11 Apr 2017, at 03:14, Jeffery, Clint (jeffe...@uidaho.edu 
>> <mailto:jeffe...@uidaho.edu>) <jeffe...@uidaho.edu 
>> <mailto:jeffe...@uidaho.edu>> wrote:
>> 
>> Hi David,
>> 
>> Good catch, you have bumped into one of my pet peeves.
>> 
>> Generators are often slower than non-generators, but not because of (or 
>> causing of) garbage collections, particularly -- they do their magic on the 
>> stack, not on the heaps.
>> 
>> Bruce is right, several Icon functions and operators such as x[y] allocate 
>> "trapped variables" just in case the surrounding code might want to assign 
>> to it.  But in many applications, structures are read from over and over and 
>> the trapped variables are avoidable.
>> 
>> On my todo-list and the Unicon help wanted list for several years now is: 
>> add another virtual machine instruction for x[y] when the surrounding syntax 
>> guarantees that it will not be assigned to, in which case the underlying 
>> code can avoid the heap allocation.  It is non-trivial enough that it won't 
>> get done on its own, someone has to volunteer, or someone has to commit some 
>> resources to it.  I might do it myself if ever it makes it to the top of my 
>> priority list.
>> 
>> Cheers,
>> Clint
>> From: David Gamey <david.ga...@rogers.com <mailto:david.ga...@rogers.com>>
>> Sent: Monday, April 10, 2017 6:49:28 PM
>> To: David Gamey; Unicon Group
>> Subject: Re: [Unicon-group] Unexpected garbage collections
>>  
>> An update
>> 
>> My spidey senses were way off.  
>> 
>> Just running every vs while with no do produced zero collections. I replaced 
>> the call with 
>> every !N do    T_Digits["2"]
>> And the collections dropped to half. So the ?S_digits is a culprit. Wonder 
>> where the other half are from. 
>> David
>> 
>> From: David Gamey <david.ga...@rogers.com <mailto:david.ga...@rogers.com>>
>> To: Unicon Group <unicon-group@lists.sourceforge.net 
>> <mailto:unicon-group@lists.sourceforge.net>> 
>> Sent: Monday, April 10, 2017 9:27 PM
>> Subject: [Unicon-group] Unexpected garbage collections
>> 
>> Hi folks,
>> 
>> Over the years I've learned some interesting things about the garbage 
>> collector and some builtin functions. Usually these show up because of a 
>> combination of a badly understood choice and huge numbers of iterations 
>> resulting an "interesting" if not pathological abuse of memory. 
>> 
>> Once again I've stumbled upon what I think are unexpected garbage 
>> collections and hoped for some insight.  Some of this is just about 
>> understanding how the garbage collector is working as much as it is about if 
>> things could be made faster.
>> 
>> I was looking at a problem that required trillions of operations so I began 
>> looking at just how some of the basics performed. So I broke down the 
>> problem into pieces and ran some benchmarks.
>> 
>> This benchmark was to look at how single digit strings convert to integers.  
>> So I thought of integer(x), ord(x)-48, Digits[x], find(x,digits)-1 just to 
>> see what happens.  Over several benchmarks and magnitudes  table is fastest, 
>> integer almost as fast, ord, the find taking about 160% the time.
>> 
>> I was surprised to see as many collections in flat code for a table lookup.  
>> Now I know 192 collections for 10^8 operations isn't alot but it's just a 
>> table lookup.
>> 
>> even ?S_digits causes about 1/2 the number of collections.  But why in the 
>> block region?
>> The table lookup is actually fastest but it generates twice the collections.
>> 
>> My spidey senses are telling me to try this without using every but I'm just 
>> guessing. 
>> 
>> Here's the relevant code:
>> 
>> procedure main(arglist)
>>                                 
>>     every (T_Digits := table())[d := !(S_Digits := string(&digits))] := d    
>>         
>>     
>>     O := options(copy(arglist),"-h!-N+-ON+")
>>     N := \O["N"] | 10^\O["ON"] | stop("Usage: "||&progname||" [-N 
>> itteration] [-ON itterationmagnitude]")
>>     printf("\nBenchmarking with %d itterations\n",N)
>>     printf("%s\n",&version)
>>     
>>         regionstat()
>>         gcolstat()
>>         t := &time                                                    # 
>> Start measurement 
>>         
>>             every !N do    T_Digits[?S_Digits]
>>             
>>         printf("Execution time = %d\n",&time - t)    # End measurement 
>>         
>>         gcolstat()
>>     &dump := 1
>> end
>> 
>> And the output from running oddcollections.exe -ON 8 run on windows 10
>> 
>> Benchmarking with 100000000 itterations
>> Unicon Version 12.3.  Feb 29, 2016
>> &regions {static, string, block} regions : 0, 41556459, 41556459
>> &collections {heap, static, string, block} regions : 0, 0, 0, 0
>> Execution time = 9386
>> &collections {heap, static, string, block} regions : 192, 0, 0, 192
>> I also bench marked smaller units of code like every !N do ?S_Digits
>> convertdigitsbench.exe  -ON 10
>> Benchmarking with 10000000000 itterations
>> &regions {static, string, block} regions : 0, 41556459, 41556459
>> &collections {heap, static, string, block} regions : 0, 0, 0, 0
>> Time for 10000000000 itterations of procedure _S_Digits       =    551978 -- 
>> &collections {heap, static, string, block} regions : 9634, 0, 0, 9633
>> Time for 10000000000 itterations of procedure _T_Digits       =    764066 -- 
>> delta &collections {heap, static, string, block} regions : 9634, 0, 0, 9633
>> Time for 10000000000 itterations of procedure _integer        =   1065958 -- 
>> delta &collections {heap, static, string, block} regions : 9634, 0, 0, 9633
>> Time for 10000000000 itterations of procedure _ord            =   1191238 -- 
>> delta &collections {heap, static, string, block} regions : 9634, 0, 0, 9633
>> Time for 10000000000 itterations of procedure _ordconst       =   1149404 -- 
>> delta &collections {heap, static, string, block} regions : 9634, 0, 0, 9633
>> Time for 10000000000 itterations of procedure _table          =   1059456 -- 
>> delta &collections {heap, static, string, block} regions : 19269, 0, 0, 19268
>> T4 := table(0)
>>    T4[procedure _S_Digits] := 551978
>>    T4[procedure _T_Digits] := 764066
>>    T4[procedure _integer] := 1065958
>>    T4[procedure _ord] := 1191238
>>    T4[procedure _ordconst] := 1149404
>>    T4[procedure _table] := 1059456
>> &collections {heap, static, string, block} regions : 67439, 0, 0, 67433
>> Thanks
>> David
>> 
>> 
>> ------------------------------------------------------------------------------
>> Check out the vibrant tech community on one of the world's most
>> engaging tech sites, Slashdot.org <http://slashdot.org/>! 
>> http://sdm.link/slashdot 
>> <http://sdm.link/slashdot>_______________________________________________
>> Unicon-group mailing list
>> Unicon-group@lists.sourceforge.net 
>> <mailto:Unicon-group@lists.sourceforge.net>
>> https://lists.sourceforge.net/lists/listinfo/unicon-group 
>> <https://lists.sourceforge.net/lists/listinfo/unicon-group>
>> 
>> 
>> ------------------------------------------------------------------------------
>> Check out the vibrant tech community on one of the world's most
>> engaging tech sites, Slashdot.org <http://slashdot.org/>! 
>> http://sdm.link/slashdot_______________________________________________ 
>> <http://sdm.link/slashdot_______________________________________________>
>> Unicon-group mailing list
>> Unicon-group@lists.sourceforge.net 
>> <mailto:Unicon-group@lists.sourceforge.net>
>> https://lists.sourceforge.net/lists/listinfo/unicon-group 
>> <https://lists.sourceforge.net/lists/listinfo/unicon-group>
> ------------------------------------------------------------------------------
> Check out the vibrant tech community on one of the world's most
> engaging tech sites, Slashdot.org! 
> http://sdm.link/slashdot_______________________________________________
> Unicon-group mailing list
> Unicon-group@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/unicon-group

------------------------------------------------------------------------------
|
|     "The belief that there is only one truth, and that oneself is in
|      possession of it, is the root of all evil in the world."  -- Max Born
|
| Dr. Robert Heckendorn
| hecke...@uidaho.edu
| http://marvin.cs.uidaho.edu/~heckendo 
| Computer Science Dept, Univ. of Idaho, Moscow, Idaho, USA   83844-1010

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Unicon-group mailing list
Unicon-group@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/unicon-group

Reply via email to