Skip to content

Move semantics optimizations

I list bench_quickopen results after (almost) each commit in this merge request below. I run bench_quickopen several times and picked the most common or middle RESULT. The first three RESULTs are fairly stable/constant/reliable because of many iterations, but the last 3 fluctuate a lot. I post the times of all runs of bench_quickopen reported at the end, e.g. 14302ms, 15079ms, ...

**master** (base at 1709733e6fababaea6eb437b4aee8364f95121dd): 14302ms, 15079ms, 14998ms, 14595ms
PASS   : BenchQuickOpen::benchProjectFileFilter_addRemoveProject(100)
RESULT : BenchQuickOpen::benchProjectFileFilter_addRemoveProject():"100":
     0.15 msecs per iteration (total: 79, iterations: 512)
PASS   : BenchQuickOpen::benchProjectFileFilter_addRemoveProject(500)
RESULT : BenchQuickOpen::benchProjectFileFilter_addRemoveProject():"500":
     0.93 msecs per iteration (total: 60, iterations: 64)
PASS   : BenchQuickOpen::benchProjectFileFilter_addRemoveProject(1000)
RESULT : BenchQuickOpen::benchProjectFileFilter_addRemoveProject():"1000":
     2.1 msecs per iteration (total: 70, iterations: 32)
PASS   : BenchQuickOpen::benchProjectFileFilter_addRemoveProjects(100)
RESULT : BenchQuickOpen::benchProjectFileFilter_addRemoveProjects():"100":
     150 msecs per iteration (total: 150, iterations: 1)
PASS   : BenchQuickOpen::benchProjectFileFilter_addRemoveProjects(500)
RESULT : BenchQuickOpen::benchProjectFileFilter_addRemoveProjects():"500":
     153 msecs per iteration (total: 153, iterations: 1)
PASS   : BenchQuickOpen::benchProjectFileFilter_addRemoveProjects(1000)
RESULT : BenchQuickOpen::benchProjectFileFilter_addRemoveProjects():"1000":
     154 msecs per iteration (total: 154, iterations: 1)

**Don't call a virtual function twice in a row**: 14908ms, 14963ms
<the detailed results skipped because the optimization is insignificant>

**Quick Open: optimize with std::move**: 14875ms, 14812ms, 14754ms
PASS   : BenchQuickOpen::benchProjectFileFilter_addRemoveProject(100)
RESULT : BenchQuickOpen::benchProjectFileFilter_addRemoveProject():"100":
     0.14 msecs per iteration (total: 74, iterations: 512)
PASS   : BenchQuickOpen::benchProjectFileFilter_addRemoveProject(500)
RESULT : BenchQuickOpen::benchProjectFileFilter_addRemoveProject():"500":
     0.87 msecs per iteration (total: 56, iterations: 64)
PASS   : BenchQuickOpen::benchProjectFileFilter_addRemoveProject(1000)
RESULT : BenchQuickOpen::benchProjectFileFilter_addRemoveProject():"1000":
     2.0 msecs per iteration (total: 67, iterations: 32)
PASS   : BenchQuickOpen::benchProjectFileFilter_addRemoveProjects(100)
RESULT : BenchQuickOpen::benchProjectFileFilter_addRemoveProjects():"100":
     149 msecs per iteration (total: 149, iterations: 1)
PASS   : BenchQuickOpen::benchProjectFileFilter_addRemoveProjects(500)
RESULT : BenchQuickOpen::benchProjectFileFilter_addRemoveProjects():"500":
     171 msecs per iteration (total: 171, iterations: 1)
PASS   : BenchQuickOpen::benchProjectFileFilter_addRemoveProjects(1000)
RESULT : BenchQuickOpen::benchProjectFileFilter_addRemoveProjects():"1000":
     162 msecs per iteration (total: 162, iterations: 1)

**Make KDevelop::Path nothrow-movable**: 14224ms, 14100ms, 14055ms
PASS   : BenchQuickOpen::benchProjectFileFilter_addRemoveProject(100)
RESULT : BenchQuickOpen::benchProjectFileFilter_addRemoveProject():"100":
     0.11 msecs per iteration (total: 61, iterations: 512)
PASS   : BenchQuickOpen::benchProjectFileFilter_addRemoveProject(500)
RESULT : BenchQuickOpen::benchProjectFileFilter_addRemoveProject():"500":
     0.76 msecs per iteration (total: 98, iterations: 128)
PASS   : BenchQuickOpen::benchProjectFileFilter_addRemoveProject(1000)
RESULT : BenchQuickOpen::benchProjectFileFilter_addRemoveProject():"1000":
     1.8 msecs per iteration (total: 59, iterations: 32)
PASS   : BenchQuickOpen::benchProjectFileFilter_addRemoveProjects(100)
RESULT : BenchQuickOpen::benchProjectFileFilter_addRemoveProjects():"100":
     150 msecs per iteration (total: 150, iterations: 1)
PASS   : BenchQuickOpen::benchProjectFileFilter_addRemoveProjects(500)
RESULT : BenchQuickOpen::benchProjectFileFilter_addRemoveProjects():"500":
     151 msecs per iteration (total: 151, iterations: 1)
PASS   : BenchQuickOpen::benchProjectFileFilter_addRemoveProjects(1000)
RESULT : BenchQuickOpen::benchProjectFileFilter_addRemoveProjects():"1000":
     155 msecs per iteration (total: 155, iterations: 1)

**static_assert that ProjectFile is nothrow-movable**: 14134ms, 13915ms, 14028ms
PASS   : BenchQuickOpen::benchProjectFileFilter_addRemoveProject(100)
RESULT : BenchQuickOpen::benchProjectFileFilter_addRemoveProject():"100":
     0.11 msecs per iteration (total: 60, iterations: 512)
PASS   : BenchQuickOpen::benchProjectFileFilter_addRemoveProject(500)
RESULT : BenchQuickOpen::benchProjectFileFilter_addRemoveProject():"500":
     0.75 msecs per iteration (total: 97, iterations: 128)
PASS   : BenchQuickOpen::benchProjectFileFilter_addRemoveProject(1000)
RESULT : BenchQuickOpen::benchProjectFileFilter_addRemoveProject():"1000":
     1.8 msecs per iteration (total: 59, iterations: 32)
PASS   : BenchQuickOpen::benchProjectFileFilter_addRemoveProjects(100)
RESULT : BenchQuickOpen::benchProjectFileFilter_addRemoveProjects():"100":
     157 msecs per iteration (total: 157, iterations: 1)
PASS   : BenchQuickOpen::benchProjectFileFilter_addRemoveProjects(500)
RESULT : BenchQuickOpen::benchProjectFileFilter_addRemoveProjects():"500":
     155 msecs per iteration (total: 155, iterations: 1)
PASS   : BenchQuickOpen::benchProjectFileFilter_addRemoveProjects(1000)
RESULT : BenchQuickOpen::benchProjectFileFilter_addRemoveProjects():"1000":
     149 msecs per iteration (total: 149, iterations: 1)

I have described the impact of some of these optimizations on opening/closing a project in comments to !176 (closed). A summary:

  • Quick Open: optimize with std::move corresponds to std::move(f) in https://invent.kde.org/igorkushnir/kdevelop/-/commits/quickopen-bench-2. It brought down the opening time of kdevelop project from 227ms to 214ms.
  • Make KDevelop::Path nothrow-movable squashes two commits - Make KDevelop::Path movable and Make KDevelop::Path nothrow-movable - in the same branch. The first of the two commits brought down the opening time of kdevelop project from 177ms to 172ms. The second part - from 172ms to 163ms. In addition I have measured the impact of the second part on the project closing time: it dropped from 181ms to 165ms.

I've run several relevant tests and benchmarks after Make KDevelop::Path movable and Make TypePtr and DUChainPointer movable. The detailed test/benchmark list is in !176 (comment 116289). No benchmark other than bench_quickopen has benefitted substantially from these performance improvements.

See commit messages for details.

Merge request reports