[cmake-developers] cost of usage requirements (was: Compiler features/extensions remaining/future issues)
Brad King
brad.king at kitware.com
Wed Jun 11 10:46:52 EDT 2014
On 06/10/2014 01:17 PM, Ben Boeckel wrote:
> Brad is going to take a deeper look at it and might have more
> information in the next few days.
Here is a sscce::
cmake_minimum_required(VERSION 2.8.9)
project(ManyLibs C)
set(LibPrev)
foreach(n RANGE 100)
add_library(Lib${n} SHARED lib.c)
target_link_libraries(Lib${n} LINK_PUBLIC ${LibPrev})
set(LibPrev Lib${n})
endforeach()
On my machine:
========= ========= ========= ========
version real user sys
========= ========= ========= ========
2.8.9 0m0.428s 0m0.384s 0m0.036s
2.8.12.2 0m2.100s 0m2.016s 0m0.060s
3.0.0 0m2.856s 0m2.796s 0m0.052s
487b6ccd 0m5.232s 0m5.176s 0m0.044s
see below 0m3.450s 0m3.356s 0m0.084s
========= ========= ========= ========
The usage requirement features have added a big performance
cost even when they are not used. The transitive INTERFACE
$<TARGET_PROPERTY> lookups cause O(n^2) computation time for
link chains of length n due to the dependency on headTarget.
(For reference of others, the "headTarget" is the target
whose build rules are currently being computed, and its
dependencies may report different usage requirements based
on what is consuming them.)
I was able to lower the constant factor on the O(n^2) time
locally with a change to make GetTransitiveTargetClosure
callers:
http://cmake.org/gitweb?p=cmake.git;a=blob;f=Source/cmTarget.cxx;hb=487b6ccd#l5215
http://cmake.org/gitweb?p=cmake.git;a=blob;f=Source/cmTarget.cxx;hb=487b6ccd#l5431
receive the value returned by reference from an internal map
that memoizes the result. See attached patch series.
However, please look at improving the implementation to have
something under O(n^2) complexity when the usage requirements
do not actually depend on the headTarget.
Thanks,
-Brad
More information about the cmake-developers
mailing list