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
-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/cgi-bin/mailman/listinfo/cmake-developers

Reply via email to