[ 
https://issues.apache.org/jira/browse/GEODE-8212?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17132617#comment-17132617
 ] 

Blake Bender edited comment on GEODE-8212 at 6/10/20, 6:56 PM:
---------------------------------------------------------------

Okay, here's the latest:

 
 * First, the call to PdxInstanceFactory::writeString was being called in the 
order (value, key) rather than (key, value).  This meant that _literally_ every 
iteration was producing a new Pdx type.  Swapping the order from:

{code:java}
auto repetitions = 5000; 
for (auto i = 0; i < repetitions; ++i) { 
    auto instance_factory = 
cache.createPdxInstanceFactory(gemfireJsonClassName);       
    instance_factory.writeString(std::to_string(i), "bar");
}{code}
to:
{code:java}
auto repetitions = 5000; 
for (auto i = 0; i < repetitions; ++i) { 
    auto instance_factory = 
cache.createPdxInstanceFactory(gemfireJsonClassName);       
    instance_factory.writeString("bar", std::to_string(i));
} {code}
Took the timing way down, as shown below:

before:
{code:java}
○ → ctest -R testCreateInstanceFactory -VV 2>&1 | grep Elapsed
30: Elapsed Time (createPdxInstanceFactory): 17 milliseconds
30: Elapsed Time (instance_factory.writeString): 5 milliseconds
30: Elapsed Time (instance_factory.create): 12817 milliseconds
30: Elapsed Time (whole test): 12854 milliseconds{code}
after:
{code:java}
○ → ctest -R testCreateInstanceFactory -VV 2>&1 | grep Elapsed
30: Elapsed Time (createPdxInstanceFactory): 9 milliseconds
30: Elapsed Time (instance_factory.writeString): 2 milliseconds
30: Elapsed Time (instance_factory.create): 2299 milliseconds
30: Elapsed Time (whole test): 2328 milliseconds {code}
Then, I realized that I had turned on debug-level logging as part of my 
investigation, so my results were probably still too high.  Turning logging 
off, I got the following:
{code:java}
○ → ctest -R testCreateInstanceFactory -VV 2>&1 | grep Elapsed
30: Elapsed Time (createPdxInstanceFactory): 10 milliseconds
30: Elapsed Time (instance_factory.writeString): 1 milliseconds
30: Elapsed Time (instance_factory.create): 442 milliseconds
30: Elapsed Time (whole test): 471 milliseconds {code}
I checked to see if perhaps something in the code was confusing compiler 
optimization, and made a change I think we'll keep anyway because it makes the 
operation more explicit.

before:
{code:java}
auto typeIdLessThan = this->m_geodeTypeId < other.m_geodeTypeId;
auto typeIdsBothZero = (m_geodeTypeId == 0) && (other.m_geodeTypeId == 0);
auto classnameLessThan = this->m_className < other.m_className;
return (typeIdLessThan || (typeIdsBothZero && classnameLessThan)); {code}
after:
{code:java}
if (m_geodeTypeId < other.m_geodeTypeId) {
  return true;
}

if ((m_geodeTypeId == 0) && (other.m_geodeTypeId == 0)) {
  return this->m_className < other.m_className;
}

return false; {code}
Unsurprisingly, this made no discernible difference in the timing.

I also tried moving `operator<` into the header and marking it inline, just to 
be absolutely sure.  Again, no discernible improvement.

At this point, I believe we can lower the priority of this bug.  The 
performance difference is still a thing, but again the prior implementation was 
_wrong_, and fast but wrong is still wrong.  I believe the current 
implementation is as slow as it has to be, and no slower.


was (Author: bbender):
Okay, here's the latest:

 
 * First, the call to 

{code:java}
auto repetitions = 5000;
for (auto i = 0; i < repetitions; ++i) {
    auto instance_factory =
        cache.createPdxInstanceFactory(gemfireJsonClassName);
    instance_factory.writeString("bar", std::to_string(i));{code}

> Change in PdxType class "<" operator impacts performance
> --------------------------------------------------------
>
>                 Key: GEODE-8212
>                 URL: https://issues.apache.org/jira/browse/GEODE-8212
>             Project: Geode
>          Issue Type: Improvement
>          Components: native client
>            Reporter: Alberto Bustamante Reyes
>            Assignee: Blake Bender
>            Priority: Major
>         Attachments: performance_after_GEODE-7694.patch
>
>
> While investigating a performance problem of the C++ native client, it has 
> been observed that change in the PdxType class "<" operator introduced by 
> GEODE-7694 impacts performance of PdxHelper::serializePdx().
> Im attaching a patch with some code and a test case I have used to benchmark 
> that method. With the current implementation in develop branch, creating just 
> 10 instances is enough to see the difference. The calls to serializePdx take 
> these times:
> {noformat}
> Elapsed Time (serializePdx): 32.1322 milliseconds​
> Elapsed Time (serializePdx): 3.06044 milliseconds​
> Elapsed Time (serializePdx): 1.58791 milliseconds​
> Elapsed Time (serializePdx): 1.62466 milliseconds​
> Elapsed Time (serializePdx): 1.53676 milliseconds​
> Elapsed Time (serializePdx): 1.59278 milliseconds​
> Elapsed Time (serializePdx): 1.82878 milliseconds​
> Elapsed Time (serializePdx): 1.36811 milliseconds​
> Elapsed Time (serializePdx): 1.6956 milliseconds​
> Elapsed Time (serializePdx): 1.46873 milliseconds​
> Elapsed Time (serializePdx): 1.53206 milliseconds​
> {noformat}
> While these are the times using the old "<" operator:
> {noformat}
> Elapsed Time (serializePdx): 56.1524 milliseconds
> Elapsed Time (serializePdx): 0.012327 milliseconds
> Elapsed Time (serializePdx): 0.006325 milliseconds
> Elapsed Time (serializePdx): 0.005419 milliseconds
> Elapsed Time (serializePdx): 0.005266 milliseconds
> Elapsed Time (serializePdx): 0.005662 milliseconds
> Elapsed Time (serializePdx): 0.005407 milliseconds
> Elapsed Time (serializePdx): 0.005286 milliseconds
> Elapsed Time (serializePdx): 0.005467 milliseconds
> Elapsed Time (serializePdx): 0.005276 milliseconds
> Elapsed Time (serializePdx): 0.005298 milliseconds
> {noformat}
> And after creating 50.000 instances, these are the times for the last 10 
> calls with the current "<" operator and with the old one respectively::
> {noformat}
> Elapsed Time (serializePdx): 8.11767 milliseconds​
> Elapsed Time (serializePdx): 8.15727 milliseconds​
> Elapsed Time (serializePdx): 8.09303 milliseconds​
> Elapsed Time (serializePdx): 7.89909 milliseconds​
> Elapsed Time (serializePdx): 8.37956 milliseconds​
> Elapsed Time (serializePdx): 8.21303 milliseconds​
> Elapsed Time (serializePdx): 8.14189 milliseconds​
> Elapsed Time (serializePdx): 8.21266 milliseconds​
> Elapsed Time (serializePdx): 8.21683 milliseconds​
> Elapsed Time (serializePdx): 7.78765 milliseconds
> {noformat}
> {noformat}
> Elapsed Time (serializePdx): 0.003014 milliseconds​
> Elapsed Time (serializePdx): 0.003 milliseconds​
> Elapsed Time (serializePdx): 0.003084 milliseconds​
> Elapsed Time (serializePdx): 0.003112 milliseconds​
> Elapsed Time (serializePdx): 0.00305 milliseconds​
> Elapsed Time (serializePdx): 0.003018 milliseconds​
> Elapsed Time (serializePdx): 0.003029 milliseconds​
> Elapsed Time (serializePdx): 0.003061 milliseconds​
> Elapsed Time (serializePdx): 0.003043 milliseconds​
> Elapsed Time (serializePdx): 0.003086 milliseconds​
> {noformat}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to