ccls与clangd 索引

下载的clangd 9.0的版本尝鲜,发现用开启索引后会崩溃.看日志应该是字符集导致的.然后我特意看了看clangd的索引与ccls的索引.发现clangd的索引文件好小啊.

ccls

clangd

不知道ccls的索引还有没有优化的余地

ccls索引有優化餘地,主要在於把Indexer{Func,Type,Var}體積減小。最近有個改動實現了一個優化:

Change containers of Query*::Def fields from std::vector to ccls::Vec

Query*::Def contain several immutable std::vector fields. Change them to
ccls::Vec to save bytes which were wasted by `capacity`.

另外可以參考clangd RIFF設計,比如提取字串池,提取RoleSlab單獨存儲等。

clangd索引檔案很小的一個重要原因是:clangd-indexer --executor=all-TUS compile_commands.json > clangd.dexclangd -background-index檢索non-local符號而ccls/cquery檢索所有符號。但每個符號,clangd存儲量大於ccls,加載到記憶體後開銷也大於ccls。

  • ccls這種做法的好處是處理cross reference請求時,只需要考慮一份索引,實現簡單。另一個好處是方便用於離線工具,比如根據全局索引進行social network的分析。確實點實時性差,檔案裏新添加一個function,只有保存後纔會索引下來,textDocument/hover纔會顯示。需要實時性的textDocument/completiontextDocument/publishDiagnostics採用獨立的機制。
  • clangd做法的好處是較小的索引,實時性好。缺點在於需要維護non-local和local兩份索引,這個在實現上有較大複雜性(2017年末還在維護cquery時他們僅有local部分,我就思考過)。查詢時需要合併non-local和local。每個打開的檔案維護AST(有一定記憶體開銷),不超過3個,超過後則LRU逐出(因此若交替請求超過3個檔案會反覆重新生成AST)。local索引部分從AST獲取。另外他們目前使用的MergedIndex(-index, MergedIndex(-background-index, -index-file))不支援incremental update。爲了性能考慮還要構建dex索引,每次重建會有CPU開銷。

clangd實時性好的做法可以考慮用到textDocument/hover等方法中。我一直關注他們開發看有什麼能用於改進ccls的地方:)

1 个赞

Add initialization option index.initialNoLinkage: false by MaskRay · Pull Request #345 · MaskRay/ccls · GitHub 現在ccls HEAD記憶體佔用應該小了很多,cache files稍微小了一點。

明天重新编译一份试试。ccls我重度使用。感觉越来越好用了