Skip to content
  • Milian Wolff's avatar
    Cache ProblemPointers per translation unit · f2a6941e
    Milian Wolff authored
    Summary:
    For visibility purposes, all 'inclue file not found' errors are
    associated with all files in a TU, since these usually completely
    break the interpretation of a file. But in some situations, this
    triggers a severe performance degradation:
    
    When the TU has a deep include stack depth and a file is not found
    somewhere at the bottom of the stack, then it will have one child
    diagnostic for every "included from ..." file higher up in the stack.
    Now if we would repeatedly build and intern the KDevelop::Problem
    representation for these diagnostics, for every file in the TU, we
    sometimes ended up spending *minutes* to create all the problems
    in ParseSession::problemsForFile!
    
    To workaround this situation, cache the ProblemPointer in the
    ParseSessionData for a given translation unit. This way, we will
    only convert a given diagnostic and its child diagnostics once per TU
    instead of once per file contained in a TU.
    
    In my case this brings down the time spent in problemsForFile for a
    single TU from ~7min (sic!) down to ~12s. While the latter is still
    a lot, this is already much more bearable.
    
    BUG: 386720
    
    Reviewers: #kdevelop
    
    Subscribers: kdevelop-devel
    
    Differential Revision: https://phabricator.kde.org/D9772
    f2a6941e