[Patch v2] [BZ 15884] strcoll: improve performance by removing the cache

Stefan Liebler stli@linux.vnet.ibm.com
Thu Oct 23 10:18:00 GMT 2014


Hi Leonhard,
the testcase timed out after 300s before the patch,
which is interpreted as passing.
Bye

On 10/22/2014 10:39 PM, Leonhard Holz wrote:
> Hi Stefan,
>
> is this a new problem or did it occure before the patch?
>
> Best,
> Leonhard
>
> Am 22.10.2014 17:13, schrieb Stefan Liebler:
>> Hi Leonhard,
>>
>> great job.
>> If I run make xcheck on s390x, I get a failure in
>> string/tst-strcoll-overflow testcase. See tst-strcoll-overflow.out:
>> 0
>> Expected signal 'Alarm clock' from child, got none
>>
>> I measured the execution time of this testcase between 35...60s
>> which is smaller than the defined timeout of 300s.
>> Can you change the behaviour of the testcase that it is passing
>> if it was timed out or if it returns successfully without timeout.
>>
>> Bye
>> Stefan
>>
>> On 10/14/2014 03:11 PM, Leonhard Holz wrote:
>>> Hello everybody,
>>>
>>> this is a path that should solve bug 15884. It complains about the
>>> performance of strcoll(). It was found out that the runtime of strcoll()
>>> is actually bound to strlen which is needed for calculating the size of
>>> a cache that was installed to improve the comparison performance.
>>>
>>> The idea for this patch was that the cache is only useful in rare cases
>>> (strings of same length and same first-level-chars) and that it would be
>>> better to avoid memory allocation at all. To prove this I wrote a
>>> performance test bench-strcoll.c with test data in
>>> benchtests-strcoll.tar.gz. Also modifications in benchtests/Makefile and
>>> localedata/Makefile are necessary to make it work.
>>>
>>> After removing the cache the strcoll method showed the predicted
>>> behavior (getting slightly faster) in all but the test case for hindi
>>> word sorting. This was due the hindi text having much more equal words
>>> than the other ones. For equal strings the performance was worse since
>>> all comparison levels were run through and from the second level on the
>>> cache improved the comparison performance of the original version.
>>>
>>> Therefore I added a bytewise test via strcmp iff the first level
>>> comparison found that both strings did match because in this case it is
>>> very likely that equal strings are compared. This solved the problem
>>> with the hindi test case and improved the performance of the others.
>>>
>>> The output of the benchmark is:
>>>
>>>    "strcoll": {
>>>     "": {
>>>      "locale": "en_US.UTF-8",
>>>      "duration": 7.41506e+09,
>>>      "iterations": 16,
>>>      "mean": 4.63441e+08
>>>     },
>>>     "vi_VN.UTF-8": {
>>>      "duration": 7.4185e+07,
>>>      "iterations": 16,
>>>      "mean": 4.63656e+06
>>>     },
>>>     "en_US.UTF-8": {
>>>      "duration": 7.59759e+07,
>>>      "iterations": 16,
>>>      "mean": 4.7485e+06
>>>     },
>>>     "ar_SA.UTF-8": {
>>>      "duration": 7.61479e+07,
>>>      "iterations": 16,
>>>      "mean": 4.75924e+06
>>>     },
>>>     "zh_CN.UTF-8": {
>>>      "duration": 1.37535e+07,
>>>      "iterations": 16,
>>>      "mean": 859594
>>>     },
>>>     "cs_CZ.UTF-8": {
>>>      "duration": 7.90032e+07,
>>>      "iterations": 16,
>>>      "mean": 4.9377e+06
>>>     },
>>>     "en_GB.UTF-8": {
>>>      "duration": 7.4454e+07,
>>>      "iterations": 16,
>>>      "mean": 4.65338e+06
>>>     },
>>>     "da_DK.UTF-8": {
>>>      "duration": 7.265e+07,
>>>      "iterations": 16,
>>>      "mean": 4.54062e+06
>>>     },
>>>     "pl_PL.UTF-8": {
>>>      "duration": 7.28964e+07,
>>>      "iterations": 16,
>>>      "mean": 4.55602e+06
>>>     },
>>>     "fr_FR.UTF-8": {
>>>      "duration": 7.99239e+07,
>>>      "iterations": 16,
>>>      "mean": 4.99524e+06
>>>     },
>>>     "pt_PT.UTF-8": {
>>>      "duration": 7.78347e+07,
>>>      "iterations": 16,
>>>      "mean": 4.86467e+06
>>>     },
>>>     "el_GR.UTF-8": {
>>>      "duration": 1.0959e+08,
>>>      "iterations": 16,
>>>      "mean": 6.84937e+06
>>>     },
>>>     "ru_RU.UTF-8": {
>>>      "duration": 9.39324e+07,
>>>      "iterations": 16,
>>>      "mean": 5.87077e+06
>>>     },
>>>     "iw_IL.UTF-8": {
>>>      "duration": 8.8769e+07,
>>>      "iterations": 16,
>>>      "mean": 5.54806e+06
>>>     },
>>>     "es_ES.UTF-8": {
>>>      "duration": 8.0782e+07,
>>>      "iterations": 16,
>>>      "mean": 5.04888e+06
>>>     },
>>>     "hi_IN.UTF-8": {
>>>      "duration": 3.66962e+09,
>>>      "iterations": 16,
>>>      "mean": 2.29351e+08
>>>     },
>>>     "sv_SE.UTF-8": {
>>>      "duration": 7.41934e+07,
>>>      "iterations": 16,
>>>      "mean": 4.63709e+06
>>>     },
>>>     "hu_HU.UTF-8": {
>>>      "duration": 9.04538e+07,
>>>      "iterations": 16,
>>>      "mean": 5.65336e+06
>>>     },
>>>     "tr_TR.UTF-8": {
>>>      "duration": 7.25579e+07,
>>>      "iterations": 16,
>>>      "mean": 4.53487e+06
>>>     },
>>>     "is_IS.UTF-8": {
>>>      "duration": 6.83783e+07,
>>>      "iterations": 16,
>>>      "mean": 4.27364e+06
>>>     },
>>>     "it_IT.UTF-8": {
>>>      "duration": 7.50307e+07,
>>>      "iterations": 16,
>>>      "mean": 4.68942e+06
>>>     },
>>>     "sr_RS.UTF-8": {
>>>      "duration": 8.14996e+07,
>>>      "iterations": 16,
>>>      "mean": 5.09373e+06
>>>     },
>>>     "ja_JP.UTF-8": {
>>>      "duration": 1.5325e+07,
>>>      "iterations": 16,
>>>      "mean": 957814
>>>     }
>>>    }
>>>
>>> That is compared to the previous version:
>>>
>>> glibc files    -33.77%
>>> vi_VN.UTF-8    -34.12%
>>> en_US.UTF-8    -42.42%
>>> ar_SA.UTF-8    -27.49%
>>> zh_CN.UTF-8    +07.90%
>>> cs_CZ.UTF-8    -29.67%
>>> en_GB.UTF-8    -28.50%
>>> da_DK.UTF-8    -36.57%
>>> pl_PL.UTF-8    -39.31%
>>> fr_FR.UTF-8    -28.57%
>>> pt_PT.UTF-8    -22.82%
>>> el_GR.UTF-8    -26.77%
>>> ru_RU.UTF-8    -35.81%
>>> iw_IL.UTF-8    -35.34%
>>> es_ES.UTF-8    -34.46%
>>> hi_IN.UTF-8    -00.38%
>>> sv_SE.UTF-8    -36.99%
>>> hu_HU.UTF-8    -16.35%
>>> tr_TR.UTF-8    -27.80%
>>> is_IS.UTF-8    -33.24%
>>> it_IT.UTF-8    -24.39%
>>> sr_RS.UTF-8    -37.55%
>>> ja_JP.UTF-8    +02.84%
>>>
>>> Best,
>>> Leonhard
>>>
>>>
>>> 2014-10-14  Leonhard Holz  <leonhard.holz@web.de>
>>>
>>>      [BZ #15884]
>>>      * string/strcoll_l.c (STRCOLL): Remove weight and rules cache.
>>>      * benchtests/bench-strcoll.c: New benchmark.
>>>      * benchtests/Makefile (bench-string): Use it.
>>>      * benchtests/strcoll-inputs/lorem_ipsum_ar_SA New file.
>>>      * benchtests/strcoll-inputs/lorem_ipsum_cs_CZ Likewise.
>>>      * benchtests/strcoll-inputs/lorem_ipsum_da_DK Likewise.
>>>      * benchtests/strcoll-inputs/lorem_ipsum_el_GR Likewise.
>>>      * benchtests/strcoll-inputs/lorem_ipsum_en_GB Likewise.
>>>      * benchtests/strcoll-inputs/lorem_ipsum_en_US Likewise.
>>>      * benchtests/strcoll-inputs/lorem_ipsum_es_ES Likewise.
>>>      * benchtests/strcoll-inputs/lorem_ipsum_fr_FR Likewise.
>>>      * benchtests/strcoll-inputs/lorem_ipsum_hi_IN Likewise.
>>>      * benchtests/strcoll-inputs/lorem_ipsum_hu_HU Likewise.
>>>      * benchtests/strcoll-inputs/lorem_ipsum_is_IS Likewise.
>>>      * benchtests/strcoll-inputs/lorem_ipsum_it_IT Likewise.
>>>      * benchtests/strcoll-inputs/lorem_ipsum_iw_IL Likewise.
>>>      * benchtests/strcoll-inputs/lorem_ipsum_ja_JP Likewise.
>>>      * benchtests/strcoll-inputs/lorem_ipsum_pl_PL Likewise.
>>>      * benchtests/strcoll-inputs/lorem_ipsum_pt_PT Likewise.
>>>      * benchtests/strcoll-inputs/lorem_ipsum_ru_RU Likewise.
>>>      * benchtests/strcoll-inputs/lorem_ipsum_sr_RS Likewise.
>>>      * benchtests/strcoll-inputs/lorem_ipsum_sv_SE Likewise.
>>>      * benchtests/strcoll-inputs/lorem_ipsum_tr_TR Likewise.
>>>      * benchtests/strcoll-inputs/lorem_ipsum_vi_VN Likewise.
>>>      * benchtests/strcoll-inputs/lorem_ipsum_zh_CN Likewise.
>>>      * localedata/Makefile (LOCALES): Generate needed locales.
>>>
>>
>



More information about the Libc-alpha mailing list