Sure. I agree. I'd be happy to show you the results in the profiler, so we can 
make a correct decision.

On Jun 30, 2013, at 1:23 PM, Michael Pasternak wrote:

> On 06/30/2013 01:15 PM, Michael Pasternak wrote:
>> On 06/30/2013 01:08 PM, Liran Zelkha wrote:
>>> Why synchronization? No need for it. Worst case scenario a put (which 
>>> should be much less common then get) will occur twice on the same key. 
>> 
>> why assuming a best & not worst scenario? don't forget that every new 
>> insertion requires collision resolution
>> which is triggers .equals() on the GUID.
> 
> Liran, don't get me wrong, i'm not against the caching in general, obviously 
> reads > writes so
> actually i'm all with you, just we're going to significantly enlarge a memory 
> footprint so i just want
> to make sure we're on a right track for the worst scenario where engine runs 
> for ages and hashmap reaches
> it's load factor.
> 
>> 
>>> 
>>> On Jun 30, 2013, at 1:00 PM, Michael Pasternak wrote:
>>> 
>>>> On 06/30/2013 12:45 PM, Liran Zelkha wrote:
>>>>> All is true. But average UUID.fromString execution is 1675us, and 
>>>>> HashMap.put is 78us - so the benefit is clear when we're talking on >100K 
>>>>> executions for 10minutes...
>>>> 
>>>> even with synchronization? what about ConcurrentHashMap?
>>>> 
>>>>> 
>>>>> 
>>>>> On Sun, Jun 30, 2013 at 12:44 PM, Michael Pasternak <mpast...@redhat.com 
>>>>> <mailto:mpast...@redhat.com>> wrote:
>>>>> 
>>>>>   On 06/30/2013 12:20 PM, Liran Zelkha wrote:
>>>>>> I checked such a solution using JProfiler. Creating the GUID object 
>>>>>> takes much more CPU cycles that checking the string in the Map.
>>>>> 
>>>>>   of course it is, but what is the size of map that you checked?, check 
>>>>> on worst scenario, i.e map
>>>>>   is full of all possible guids,
>>>>> 
>>>>>   also problem a bit different,java map has a load factor (which is 
>>>>> usually 0.75),
>>>>>   when ratio increases beyond the load factor, occurs proses called 
>>>>> re-hash so that the hash
>>>>>   table will double amount of buckets. what can produce a cpu spikes 
>>>>> (though it should not happen too often),
>>>>>   to avoid this the initial capacity should be greater than the maximum 
>>>>> number of entries / the
>>>>>   load factor, and this is a huge map....
>>>>> 
>>>>>   so basically this is a tradeoff between time and space costs against 
>>>>> the new guid generation.
>>>>> 
>>>>>> 
>>>>>> On Jun 30, 2013, at 12:06 PM, Michael Pasternak wrote:
>>>>>> 
>>>>>>> On 06/30/2013 11:37 AM, Liran Zelkha wrote:
>>>>>>>> Great news.
>>>>>>>> Allon - please note that GUID is being recreated from String by both 
>>>>>>>> DB calls and by data received from VDSM. It is VERY useful to cache 
>>>>>>>> Guid String-->Guid, and not
>>>>>   just Empty GUID.
>>>>>>>> 
>>>>>>>> However, as the Guid class runs in GWT as well, you can't use 
>>>>>>>> Infinispan and you're limited in the HashMap implementations you can 
>>>>>>>> use.
>>>>>>>> Personally, I don't think it's a memory leak, as GUID number in the 
>>>>>>>> system are finite and not too large.
>>>>>>> 
>>>>>>> it's large, it's 128-bit random number, it's not about memory leaking, 
>>>>>>> but cpu cost,
>>>>>>> as you'll face a lot of rehash'ings in the map,
>>>>>>> 
>>>>>>> i'm not even sure that using indexing in the map can help, worth 
>>>>>>> checking.
>>>>>>> 
>>>>>>> What do you think? Want to add it to your patch?
>>>>>>> 
>>>>>>> 
>>>>>>>> 
>>>>>>>> On Jun 30, 2013, at 11:13 AM, Yair Zaslavsky wrote:
>>>>>>>> 
>>>>>>>>> Well done, should have been done ages ago :)
>>>>>>>>> Now, for the painful rebase of async_task_mgr changes :)
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> ----- Original Message -----
>>>>>>>>>> From: "Allon Mureinik" <amure...@redhat.com 
>>>>>>>>>> <mailto:amure...@redhat.com>>
>>>>>>>>>> To: "engine-devel" <engine-devel@ovirt.org 
>>>>>>>>>> <mailto:engine-devel@ovirt.org>>, "Barak Azulay" <bazu...@redhat.com 
>>>>>>>>>> <mailto:bazu...@redhat.com>>
>>>>>>>>>> Cc: "Yair Zaslavsky" <yzasl...@redhat.com 
>>>>>>>>>> <mailto:yzasl...@redhat.com>>, "Michael Pasternak" 
>>>>>>>>>> <mpast...@redhat.com <mailto:mpast...@redhat.com>>, "Tal Nisan"
>>>>>>>>>> <tni...@redhat.com <mailto:tni...@redhat.com>>, "Ayal Baron" 
>>>>>>>>>> <aba...@redhat.com <mailto:aba...@redhat.com>>
>>>>>>>>>> Sent: Sunday, June 30, 2013 11:11:30 AM
>>>>>>>>>> Subject: Guid improvements
>>>>>>>>>> 
>>>>>>>>>> Hi all,
>>>>>>>>>> 
>>>>>>>>>> I just merged a couple of improvements to the [N]Guid class [1] to 
>>>>>>>>>> improve
>>>>>>>>>> it's performance both CPU-wise and memory-wise, based on a set of 
>>>>>>>>>> benchmarks
>>>>>>>>>> presented by Liran.
>>>>>>>>>> 
>>>>>>>>>> What this patchset achieves:
>>>>>>>>>> 1. Clean up the code, so it's easier to understand and use
>>>>>>>>>> 2. Eliminate the inflation in the memory foot print caused by the 
>>>>>>>>>> getValue()
>>>>>>>>>> method
>>>>>>>>>> 3. Eliminate all the heavy calls to UUID.fromString when creating a 
>>>>>>>>>> new/empty
>>>>>>>>>> Guid instance as a default value
>>>>>>>>>> 4. Note that the cleanups proposed in (1) will have minor performance
>>>>>>>>>> benefits (e.g., eliminating useless conditional statements), but I 
>>>>>>>>>> doubt
>>>>>>>>>> this would be anything to write home about.
>>>>>>>>>> 
>>>>>>>>>> From a developer's perspective, here's what changed:
>>>>>>>>>> 1. No more NGuid, just Guid. Both static methods to create a Guid 
>>>>>>>>>> from String
>>>>>>>>>> still exist, and are named createGuidFromString and
>>>>>>>>>> createGuidFromStringDefaultEmpty.
>>>>>>>>>> 2. [N]Guid.getValue() was removed, it's no longer needed after (1) 
>>>>>>>>>> was
>>>>>>>>>> implemented
>>>>>>>>>> 3. The Guid() constructor was made private, as it forced a redundant 
>>>>>>>>>> call to
>>>>>>>>>> UUID.fromString(String). If you need an empty Guid instance, just use
>>>>>>>>>> Guid.Empty
>>>>>>>>>> 4. The Guid.EMPTY_GUID_VALUE string constant was removed, as it was 
>>>>>>>>>> used for
>>>>>>>>>> redundant calls to UUID.fromString. If you really, REALLY, need it, 
>>>>>>>>>> just
>>>>>>>>>> call Guid.Empty.getValue() for a UUID or Guid.Empty.toString() for a 
>>>>>>>>>> String.
>>>>>>>>>> 5. All sorts of ways to transform Strings to Guids were removed. If 
>>>>>>>>>> you have
>>>>>>>>>> a literal you trust, just use new Guid(String). If you suspect it 
>>>>>>>>>> may be
>>>>>>>>>> null, use Guid.createGuidFromString[DefaultEmpty]
>>>>>>>>>> 6. NewGuid is now called newGuid. We're in Java, not C# :-)
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> Many thanks to everyone who reviewed this patchset.
>>>>>>>>>> You guys rock!
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> Regards,
>>>>>>>>>> Allon
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> [1]
>>>>>>>>>> http://gerrit.ovirt.org/#/q/project:ovirt-engine+branch:master+topic:guid-cleanup,n,z
>>>>>>>>>> 
>>>>>>>>> _______________________________________________
>>>>>>>>> Engine-devel mailing list
>>>>>>>>> Engine-devel@ovirt.org <mailto:Engine-devel@ovirt.org>
>>>>>>>>> http://lists.ovirt.org/mailman/listinfo/engine-devel
>>>>>>>> 
>>>>>>>> _______________________________________________
>>>>>>>> Engine-devel mailing list
>>>>>>>> Engine-devel@ovirt.org <mailto:Engine-devel@ovirt.org>
>>>>>>>> http://lists.ovirt.org/mailman/listinfo/engine-devel
>>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> --
>>>>>>> 
>>>>>>> Michael Pasternak
>>>>>>> RedHat, ENG-Virtualization R&D
>>>>>> 
>>>>> 
>>>>> 
>>>>>   --
>>>>> 
>>>>>   Michael Pasternak
>>>>>   RedHat, ENG-Virtualization R&D
>>>>> 
>>>>> 
>>>> 
>>>> 
>>>> -- 
>>>> 
>>>> Michael Pasternak
>>>> RedHat, ENG-Virtualization R&D
>>> 
>> 
>> 
> 
> 
> -- 
> 
> Michael Pasternak
> RedHat, ENG-Virtualization R&D

_______________________________________________
Engine-devel mailing list
Engine-devel@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-devel

Reply via email to