groovy-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Serega Sheypak <serega.shey...@gmail.com>
Subject Re: Optimizing groovy performace
Date Thu, 14 Apr 2016 21:58:07 GMT
Here is the screenshot from VisualVM.
[image: Встроенное изображение 1]

2016-04-14 23:49 GMT+02:00 Serega Sheypak <serega.sheypak@gmail.com>:

> Bump
>
> 2016-04-12 11:19 GMT+02:00 Serega Sheypak <serega.sheypak@gmail.com>:
>
>> Hi, any update here? Could you give me some input for further
>> investigation?
>>
>> 2016-04-11 12:58 GMT+02:00 Serega Sheypak <serega.sheypak@gmail.com>:
>>
>>> *>you wrote there are 20 such replacement cases... executing 20 scripts
>>> is hardly a problem, so it must happen in a loop...*
>>> Sorry, didn't understand, what do you mean by loop?
>>>
>>> *>do you reuse the scripts, or do you make a new script each time? *
>>> I suppose I do reuse, please have a look at "ScriptFactory"
>>>
>>> *Hi, here is naive caching factory:*
>>> https://gist.github.com/seregasheypak/2d7f5a16fa31018c8212754c8e94f9a4
>>>
>>> *>To give an advice I have to understand your setup better first*
>>> I run http://storm.apache.org/ topology.
>>> If you are not familiar with it, assume I have a running thread-safe
>>> java application. Java application keeps 1000 User objects and 20
>>> GroovyScripts in memory.
>>> I run 1000 (users) *20 (script: def evaluateExpression(Map context))
>>> executions each second.
>>> If script for User object returns true, I do something special.
>>>
>>> I try to cache script instances (see my gist).
>>> User object is just a bean with some logic incapsulated.
>>>
>>> 2016-04-11 11:30 GMT+02:00 Jochen Theodorou <blackdrag@gmx.org>:
>>>
>>>> On 10.04.2016 20:52, Serega Sheypak wrote:
>>>>
>>>>>  >
>>>>> org.codehaus.groovy.vmplugin.v7.Selector$MethodSelector.doCallSiteTargetSet
>>>>> I see this method after switching to indy version with invkoedynamic
>>>>>
>>>>>  That is a hint, that you have a lot of invalid callsites going on
>>>>>>
>>>>> What does it mean? What can I do in order fix it?
>>>>>
>>>>> Those are all strings?
>>>>>>
>>>>> Script template is:
>>>>>
>>>>> |defevaluateExpression(Mapcontext){defuser =context.user %s }|
>>>>>
>>>>> dynamically substituted expression could contain anything
>>>>>
>>>>> |user.attr1 =='1'||user.attr2 =='2'||user.attr3 ='3'|
>>>>>
>>>>> user object holds info about a user doing something online. attr1,
>>>>> attr2, attr3 could returns various types. Sometimes they return object
>>>>> and I override returned object equals method.
>>>>>
>>>>
>>>> you wrote there are 20 such replacement cases... executing 20 scripts
>>>> is hardly a problem, so it must happen in a loop... do you reuse the
>>>> scripts, or do you make a new script each time? Because if you do them new
>>>> each time, you have of course never ever an caching going on... but then
>>>> the compiler should appear in your measurement as bad factor as well
>>>> actually.
>>>>
>>>> To give an advice I have to understand your setup better first
>>>>
>>>>
>>>> For example, 'user' object has method:
>>>>> LastPage getLastPage(){
>>>>>          def attr = getLatestAttribute(PAGE)
>>>>>          if(attr){
>>>>>              lastPage = attr.value
>>>>>          }
>>>>>          new LastPage(lastPage: lastPage)
>>>>>      }
>>>>>
>>>>> then you can write expression:
>>>>> user.lastPage == 'somePageRegEx/.*' when you want to get true if user
>>>>> last page mathes provided regex.
>>>>>
>>>>> Here is LastPage impl:
>>>>> class LastPage {
>>>>>      String lastPage
>>>>>
>>>>>      @Override
>>>>>      String toString(){
>>>>>          lastPage
>>>>>      }
>>>>>
>>>>>      @Override
>>>>>      int hashCode(){
>>>>>          1
>>>>>      }
>>>>>
>>>>>      @Override
>>>>>      boolean equals(Object object){
>>>>>          if(object == null || !(object instanceof String || object
>>>>> instanceof LastPage)){
>>>>>              return false
>>>>>          }
>>>>>          if(object instanceof LastPage){
>>>>>              lastPage.equals(object.lastPage)
>>>>>          }
>>>>>          else{
>>>>>              Pattern pattern = Pattern.compile((String)object)
>>>>>              lastPage ==~ pattern
>>>>>          }
>>>>>      }
>>>>> }
>>>>>
>>>>
>>>> and pattern compilation here does not have a negative factor in your
>>>> measurement?
>>>>
>>>> bye Jochen
>>>>
>>>
>>>
>>
>

Mime
View raw message