I believe you should @CompileStatic the code doing t.member = val as well.

On 21 January 2016 at 16:47, Schalk Cronjé <ysb33r@gmail.com> wrote:
No idea if this will improve it, but have you tried the following?

  t.@member = val



On 21/01/2016 15:39, Marshall, Simon wrote:

Hi all, I’d like class field access in specific classes to be without groovy magic, so that it is as fast as possible.  I guess this means disabling runtime metaprogramming for specific classes (or fields).

 

At first, the http://docs.groovy-lang.org/latest/html/api/groovy/transform/CompileStatic.html annotation looked like it might do the trick, as it mentions class properties being covered.  It certainly works for class methods, but in my testing it didn’t make any difference to class members.  Setting the field “directly” (ie, via t.member below) is still an order of magnitude slower than using its implicit setter directly (ie, t.setMember()).  Similarly for field access vs getter.  That annotation does not seem to cover field access or assignment.

 

So, is there a way to make field access as quick as using the implicit getter/setter?  Thanks, Simon.

 

For example, on my 3+GHz Xeon with jdk1.8.0_66/groovy-all-2.4.3, the below code gives me:

 

t.member = val          34.577

t.setMember(val)        3.529

t.with { member = val } 127.922

 

package test

 

import groovy.transform.CompileStatic

 

@CompileStatic

class Test {

    String member

}

 

String val = 'test'

Test t = new Test()

 

for (long i = 0; i < 100 * 1000 * 1000; ++i) {

    t.setMember(val)

}

 

long time = 1000 * 1000 * 1000

long beg = System.currentTimeMillis()

for (long i = 0; i < time; ++i) {

    t.member = val

}

println('t.member = val\t\t'+(System.currentTimeMillis() - beg) / 1000.0)

 

beg = System.currentTimeMillis()

for (long i = 0; i < time; ++i) {

    t.setMember(val)

}

println('t.setMember(val)\t'+(System.currentTimeMillis() - beg) / 1000.0)

 

beg = System.currentTimeMillis()

for (long i = 0; i < time; ++i) {

    t.with { member = val }

}

println('t.with { member = val }\t'+(System.currentTimeMillis() - beg) / 1000.0)

 

"Misys" is the trade name of the Misys group of companies. This email and any attachments have been scanned for known viruses using multiple scanners. This email message is intended for the named recipient only. It may be privileged and/or confidential. If you are not the named recipient of this email please notify us immediately and do not copy it or use it for any purpose, nor disclose its contents to any other person. This email does not constitute the commencement of legal relations between you and Misys. Please refer to the executed contract between you and the relevant member of the Misys group for the identity of the contracting party with which you are dealing.


-- 
Schalk W. Cronjé
Twitter / Ello / Toeter : @ysb33r