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