mirror of
				https://github.com/MaskRay/ccls.git
				synced 2025-11-03 22:04:24 +00:00 
			
		
		
		
	Basic performance data tracking during indexing
This commit is contained in:
		
							parent
							
								
									f2d46e86b7
								
							
						
					
					
						commit
						2b407e0bce
					
				@ -22,6 +22,7 @@
 | 
				
			|||||||
#include <functional>
 | 
					#include <functional>
 | 
				
			||||||
#include <iostream>
 | 
					#include <iostream>
 | 
				
			||||||
#include <string>
 | 
					#include <string>
 | 
				
			||||||
 | 
					#include <sstream>
 | 
				
			||||||
#include <unordered_map>
 | 
					#include <unordered_map>
 | 
				
			||||||
#include <thread>
 | 
					#include <thread>
 | 
				
			||||||
#include <vector>
 | 
					#include <vector>
 | 
				
			||||||
@ -49,7 +50,16 @@ std::vector<std::string> kEmptyArgs;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std::string FormatMicroseconds(long long microseconds) {
 | 
				
			||||||
 | 
					  long long milliseconds = microseconds / 1000;
 | 
				
			||||||
 | 
					  long long remaining = microseconds  - milliseconds;
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  // Only show two digits after the dot.
 | 
				
			||||||
 | 
					  while (remaining >= 100)
 | 
				
			||||||
 | 
					    remaining /= 10;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return std::to_string(milliseconds) + "." + std::to_string(remaining) + "ms";
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -778,18 +788,23 @@ struct Index_DoIdMap {
 | 
				
			|||||||
  std::unique_ptr<IndexFile> previous;
 | 
					  std::unique_ptr<IndexFile> previous;
 | 
				
			||||||
  std::unique_ptr<IndexFile> current;
 | 
					  std::unique_ptr<IndexFile> current;
 | 
				
			||||||
  optional<std::string> indexed_content;
 | 
					  optional<std::string> indexed_content;
 | 
				
			||||||
 | 
					  PerformanceImportFile perf;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  explicit Index_DoIdMap(std::unique_ptr<IndexFile> current,
 | 
					  explicit Index_DoIdMap(std::unique_ptr<IndexFile> current,
 | 
				
			||||||
                         optional<std::string> indexed_content)
 | 
					                         optional<std::string> indexed_content,
 | 
				
			||||||
 | 
					                         PerformanceImportFile perf)
 | 
				
			||||||
    : current(std::move(current)),
 | 
					    : current(std::move(current)),
 | 
				
			||||||
      indexed_content(indexed_content) {}
 | 
					      indexed_content(indexed_content),
 | 
				
			||||||
 | 
					      perf(perf) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  explicit Index_DoIdMap(std::unique_ptr<IndexFile> previous,
 | 
					  explicit Index_DoIdMap(std::unique_ptr<IndexFile> previous,
 | 
				
			||||||
                         std::unique_ptr<IndexFile> current,
 | 
					                         std::unique_ptr<IndexFile> current,
 | 
				
			||||||
                         optional<std::string> indexed_content)
 | 
					                         optional<std::string> indexed_content,
 | 
				
			||||||
 | 
					                         PerformanceImportFile perf)
 | 
				
			||||||
    : previous(std::move(previous)),
 | 
					    : previous(std::move(previous)),
 | 
				
			||||||
      current(std::move(current)),
 | 
					      current(std::move(current)),
 | 
				
			||||||
      indexed_content(indexed_content) {}
 | 
					      indexed_content(indexed_content),
 | 
				
			||||||
 | 
					      perf(perf) {}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct Index_OnIdMapped {
 | 
					struct Index_OnIdMapped {
 | 
				
			||||||
@ -798,18 +813,25 @@ struct Index_OnIdMapped {
 | 
				
			|||||||
  std::unique_ptr<IdMap> previous_id_map;
 | 
					  std::unique_ptr<IdMap> previous_id_map;
 | 
				
			||||||
  std::unique_ptr<IdMap> current_id_map;
 | 
					  std::unique_ptr<IdMap> current_id_map;
 | 
				
			||||||
  optional<std::string> indexed_content;
 | 
					  optional<std::string> indexed_content;
 | 
				
			||||||
 | 
					  PerformanceImportFile perf;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Index_OnIdMapped(const optional<std::string>& indexed_content)
 | 
					  Index_OnIdMapped(const optional<std::string>& indexed_content,
 | 
				
			||||||
    : indexed_content(indexed_content) {}
 | 
					                   PerformanceImportFile perf)
 | 
				
			||||||
 | 
					    : indexed_content(indexed_content),
 | 
				
			||||||
 | 
					      perf(perf) {}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct Index_OnIndexed {
 | 
					struct Index_OnIndexed {
 | 
				
			||||||
  IndexUpdate update;
 | 
					  IndexUpdate update;
 | 
				
			||||||
  // Map is file path to file content.
 | 
					  // Map is file path to file content.
 | 
				
			||||||
  std::unordered_map<std::string, std::string> indexed_content;
 | 
					  std::unordered_map<std::string, std::string> indexed_content;
 | 
				
			||||||
 | 
					  PerformanceImportFile perf;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  explicit Index_OnIndexed(IndexUpdate& update, const optional<std::string>& indexed_content)
 | 
					  explicit Index_OnIndexed(
 | 
				
			||||||
    : update(update) {
 | 
					      IndexUpdate& update,
 | 
				
			||||||
 | 
					      const optional<std::string>& indexed_content,
 | 
				
			||||||
 | 
					      PerformanceImportFile perf)
 | 
				
			||||||
 | 
					    : update(update), perf(perf) {
 | 
				
			||||||
    if (indexed_content) {
 | 
					    if (indexed_content) {
 | 
				
			||||||
      assert(update.files_def_update.size() == 1);
 | 
					      assert(update.files_def_update.size() == 1);
 | 
				
			||||||
      this->indexed_content[update.files_def_update[0].path] = *indexed_content;
 | 
					      this->indexed_content[update.files_def_update[0].path] = *indexed_content;
 | 
				
			||||||
@ -962,11 +984,11 @@ bool ImportCachedIndex(IndexerConfig* config,
 | 
				
			|||||||
                       const std::string& tu_path,
 | 
					                       const std::string& tu_path,
 | 
				
			||||||
                       const optional<std::string>& indexed_content) {
 | 
					                       const optional<std::string>& indexed_content) {
 | 
				
			||||||
  // TODO: only load cache if command line arguments are the same.
 | 
					  // TODO: only load cache if command line arguments are the same.
 | 
				
			||||||
 | 
					  PerformanceImportFile tu_perf;
 | 
				
			||||||
  Timer time;
 | 
					  Timer time;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  std::unique_ptr<IndexFile> cache = LoadCachedIndex(config, tu_path);
 | 
					  std::unique_ptr<IndexFile> cache = LoadCachedIndex(config, tu_path);
 | 
				
			||||||
  time.ResetAndPrint("Reading cached index from disk " + tu_path);
 | 
					  tu_perf.index_load_cached = time.ElapsedMicrosecondsAndReset();
 | 
				
			||||||
  if (!cache)
 | 
					  if (!cache)
 | 
				
			||||||
    return true;
 | 
					    return true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -974,14 +996,17 @@ bool ImportCachedIndex(IndexerConfig* config,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  // Import all dependencies.
 | 
					  // Import all dependencies.
 | 
				
			||||||
  for (auto& dependency_path : cache->dependencies) {
 | 
					  for (auto& dependency_path : cache->dependencies) {
 | 
				
			||||||
    std::cerr << "- Got dependency " << dependency_path << std::endl;
 | 
					    //std::cerr << "- Got dependency " << dependency_path << std::endl;
 | 
				
			||||||
 | 
					    PerformanceImportFile perf;
 | 
				
			||||||
 | 
					    time.Reset();
 | 
				
			||||||
    std::unique_ptr<IndexFile> cache = LoadCachedIndex(config, dependency_path);
 | 
					    std::unique_ptr<IndexFile> cache = LoadCachedIndex(config, dependency_path);
 | 
				
			||||||
 | 
					    perf.index_load_cached = time.ElapsedMicrosecondsAndReset();
 | 
				
			||||||
    if (cache && GetLastModificationTime(cache->path) == cache->last_modification_time)
 | 
					    if (cache && GetLastModificationTime(cache->path) == cache->last_modification_time)
 | 
				
			||||||
      file_consumer_shared->Mark(cache->path);
 | 
					      file_consumer_shared->Mark(cache->path);
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
      needs_reparse = true;
 | 
					      needs_reparse = true;
 | 
				
			||||||
    if (cache)
 | 
					    if (cache)
 | 
				
			||||||
      queue_do_id_map->Enqueue(Index_DoIdMap(std::move(cache), nullopt));
 | 
					      queue_do_id_map->Enqueue(Index_DoIdMap(std::move(cache), nullopt, perf));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Import primary file.
 | 
					  // Import primary file.
 | 
				
			||||||
@ -989,7 +1014,7 @@ bool ImportCachedIndex(IndexerConfig* config,
 | 
				
			|||||||
    file_consumer_shared->Mark(tu_path);
 | 
					    file_consumer_shared->Mark(tu_path);
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    needs_reparse = true;
 | 
					    needs_reparse = true;
 | 
				
			||||||
  queue_do_id_map->Enqueue(Index_DoIdMap(std::move(cache), indexed_content));
 | 
					  queue_do_id_map->Enqueue(Index_DoIdMap(std::move(cache), indexed_content, tu_perf));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return needs_reparse;
 | 
					  return needs_reparse;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -999,21 +1024,22 @@ void ParseFile(IndexerConfig* config,
 | 
				
			|||||||
               Index_DoIdMapQueue* queue_do_id_map,
 | 
					               Index_DoIdMapQueue* queue_do_id_map,
 | 
				
			||||||
               const Project::Entry& entry,
 | 
					               const Project::Entry& entry,
 | 
				
			||||||
               const optional<std::string>& indexed_content) {
 | 
					               const optional<std::string>& indexed_content) {
 | 
				
			||||||
  Timer time;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  std::unique_ptr<IndexFile> cache_for_args = LoadCachedIndex(config, entry.filename);
 | 
					  std::unique_ptr<IndexFile> cache_for_args = LoadCachedIndex(config, entry.filename);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  std::string tu_path = cache_for_args ? cache_for_args->import_file : entry.filename;
 | 
					  std::string tu_path = cache_for_args ? cache_for_args->import_file : entry.filename;
 | 
				
			||||||
  const std::vector<std::string>& tu_args = entry.args;
 | 
					  const std::vector<std::string>& tu_args = entry.args;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  PerformanceImportFile perf;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  std::vector<std::unique_ptr<IndexFile>> indexes = Parse(
 | 
					  std::vector<std::unique_ptr<IndexFile>> indexes = Parse(
 | 
				
			||||||
    config, file_consumer_shared,
 | 
					    config, file_consumer_shared,
 | 
				
			||||||
    tu_path, tu_args,
 | 
					    tu_path, tu_args,
 | 
				
			||||||
    entry.filename, indexed_content);
 | 
					    entry.filename, indexed_content,
 | 
				
			||||||
  time.ResetAndPrint("Parsing/indexing " + tu_path);
 | 
					    &perf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  for (std::unique_ptr<IndexFile>& new_index : indexes) {
 | 
					  for (std::unique_ptr<IndexFile>& new_index : indexes) {
 | 
				
			||||||
    std::cerr << "Got index for " << new_index->path << std::endl;
 | 
					    Timer time;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Load the cached index.
 | 
					    // Load the cached index.
 | 
				
			||||||
    std::unique_ptr<IndexFile> cached_index;
 | 
					    std::unique_ptr<IndexFile> cached_index;
 | 
				
			||||||
@ -1024,7 +1050,8 @@ void ParseFile(IndexerConfig* config,
 | 
				
			|||||||
    // TODO: Enable this assert when we are no longer forcibly indexing the primary file.
 | 
					    // TODO: Enable this assert when we are no longer forcibly indexing the primary file.
 | 
				
			||||||
    //assert(!cached_index || GetLastModificationTime(new_index->path) != cached_index->last_modification_time);
 | 
					    //assert(!cached_index || GetLastModificationTime(new_index->path) != cached_index->last_modification_time);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    time.ResetAndPrint("Loading cached index");
 | 
					    // Note: we are reusing the parent perf.
 | 
				
			||||||
 | 
					    perf.index_load_cached = time.ElapsedMicrosecondsAndReset();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Publish diagnostics.
 | 
					    // Publish diagnostics.
 | 
				
			||||||
    if (!new_index->diagnostics.empty() || (cached_index && !cached_index->diagnostics.empty())) {
 | 
					    if (!new_index->diagnostics.empty() || (cached_index && !cached_index->diagnostics.empty())) {
 | 
				
			||||||
@ -1052,11 +1079,12 @@ void ParseFile(IndexerConfig* config,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // Cache the newly indexed file. This replaces the existing cache.
 | 
					    // Cache the newly indexed file. This replaces the existing cache.
 | 
				
			||||||
    // TODO: Run this as another import pipeline stage.
 | 
					    // TODO: Run this as another import pipeline stage.
 | 
				
			||||||
 | 
					    time.Reset();
 | 
				
			||||||
    WriteToCache(config, new_index->path, *new_index, content);
 | 
					    WriteToCache(config, new_index->path, *new_index, content);
 | 
				
			||||||
    time.ResetAndPrint("Cache index update to disk");
 | 
					    perf.index_save_to_disk = time.ElapsedMicrosecondsAndReset();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Dispatch IdMap creation request, which will happen on querydb thread.
 | 
					    // Dispatch IdMap creation request, which will happen on querydb thread.
 | 
				
			||||||
    Index_DoIdMap response(std::move(cached_index), std::move(new_index), content);
 | 
					    Index_DoIdMap response(std::move(cached_index), std::move(new_index), content, perf);
 | 
				
			||||||
    queue_do_id_map->Enqueue(std::move(response));
 | 
					    queue_do_id_map->Enqueue(std::move(response));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1066,9 +1094,8 @@ bool ResetStaleFiles(IndexerConfig* config,
 | 
				
			|||||||
                     FileConsumer::SharedState* file_consumer_shared,
 | 
					                     FileConsumer::SharedState* file_consumer_shared,
 | 
				
			||||||
                     const std::string& tu_path) {
 | 
					                     const std::string& tu_path) {
 | 
				
			||||||
  Timer time;
 | 
					  Timer time;
 | 
				
			||||||
 | 
					 | 
				
			||||||
  std::unique_ptr<IndexFile> cache = LoadCachedIndex(config, tu_path);
 | 
					  std::unique_ptr<IndexFile> cache = LoadCachedIndex(config, tu_path);
 | 
				
			||||||
  time.ResetAndPrint("Reading cached index from disk " + tu_path);
 | 
					
 | 
				
			||||||
  if (!cache) {
 | 
					  if (!cache) {
 | 
				
			||||||
    std::cerr << "[indexer] Unable to load existing index from file when freshening (dependences will not be freshened)" << std::endl;
 | 
					    std::cerr << "[indexer] Unable to load existing index from file when freshening (dependences will not be freshened)" << std::endl;
 | 
				
			||||||
    file_consumer_shared->Mark(tu_path);
 | 
					    file_consumer_shared->Mark(tu_path);
 | 
				
			||||||
@ -1079,7 +1106,6 @@ bool ResetStaleFiles(IndexerConfig* config,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  // Check dependencies
 | 
					  // Check dependencies
 | 
				
			||||||
  for (auto& dependency_path : cache->dependencies) {
 | 
					  for (auto& dependency_path : cache->dependencies) {
 | 
				
			||||||
    std::cerr << "- Got dependency " << dependency_path << std::endl;
 | 
					 | 
				
			||||||
    std::unique_ptr<IndexFile> cache = LoadCachedIndex(config, dependency_path);
 | 
					    std::unique_ptr<IndexFile> cache = LoadCachedIndex(config, dependency_path);
 | 
				
			||||||
    if (GetLastModificationTime(cache->path) != cache->last_modification_time) {
 | 
					    if (GetLastModificationTime(cache->path) != cache->last_modification_time) {
 | 
				
			||||||
      needs_reparse = true;
 | 
					      needs_reparse = true;
 | 
				
			||||||
@ -1157,10 +1183,32 @@ bool IndexMain_DoCreateIndexUpdate(
 | 
				
			|||||||
  Timer time;
 | 
					  Timer time;
 | 
				
			||||||
  IndexUpdate update = IndexUpdate::CreateDelta(response->previous_id_map.get(), response->current_id_map.get(),
 | 
					  IndexUpdate update = IndexUpdate::CreateDelta(response->previous_id_map.get(), response->current_id_map.get(),
 | 
				
			||||||
    response->previous_index.get(), response->current_index.get());
 | 
					    response->previous_index.get(), response->current_index.get());
 | 
				
			||||||
  time.ResetAndPrint("[indexer] Creating delta IndexUpdate");
 | 
					  response->perf.index_make_delta = time.ElapsedMicrosecondsAndReset();
 | 
				
			||||||
  Index_OnIndexed reply(update, response->indexed_content);
 | 
					
 | 
				
			||||||
 | 
					#define PRINT_SECTION(name) \
 | 
				
			||||||
 | 
					  if (response->perf.name) {\
 | 
				
			||||||
 | 
					    total += response->perf.name; \
 | 
				
			||||||
 | 
					    long long milliseconds = response->perf.name / 1000; \
 | 
				
			||||||
 | 
					    long long remaining = response->perf.name - milliseconds; \
 | 
				
			||||||
 | 
					    output << " " << #name << ": " << FormatMicroseconds(response->perf.name); \
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  std::stringstream output;
 | 
				
			||||||
 | 
					  long long total = 0;
 | 
				
			||||||
 | 
					  output << "[perf]";
 | 
				
			||||||
 | 
					  PRINT_SECTION(index_parse);
 | 
				
			||||||
 | 
					  PRINT_SECTION(index_build);
 | 
				
			||||||
 | 
					  PRINT_SECTION(index_save_to_disk);
 | 
				
			||||||
 | 
					  PRINT_SECTION(index_load_cached);
 | 
				
			||||||
 | 
					  PRINT_SECTION(querydb_id_map);
 | 
				
			||||||
 | 
					  PRINT_SECTION(index_make_delta);
 | 
				
			||||||
 | 
					  output << "\n       total: " << FormatMicroseconds(total);
 | 
				
			||||||
 | 
					  output << " path: " << response->current_index->path;
 | 
				
			||||||
 | 
					  output << std::endl;
 | 
				
			||||||
 | 
					  std::cerr << output.rdbuf();
 | 
				
			||||||
 | 
					#undef PRINT_SECTION
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Index_OnIndexed reply(update, response->indexed_content, response->perf);
 | 
				
			||||||
  queue_on_indexed->Enqueue(std::move(reply));
 | 
					  queue_on_indexed->Enqueue(std::move(reply));
 | 
				
			||||||
  time.ResetAndPrint("[indexer] Sending update to server");
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return true;
 | 
					  return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -1678,7 +1726,7 @@ bool QueryDbMainLoop(
 | 
				
			|||||||
          response.result.activeSignature = 0;
 | 
					          response.result.activeSignature = 0;
 | 
				
			||||||
          for (size_t i = 0; i < response.result.signatures.size(); ++i) {
 | 
					          for (size_t i = 0; i < response.result.signatures.size(); ++i) {
 | 
				
			||||||
            if (active_param < response.result.signatures.size()) {
 | 
					            if (active_param < response.result.signatures.size()) {
 | 
				
			||||||
              response.result.activeSignature = i;
 | 
					              response.result.activeSignature = (int)i;
 | 
				
			||||||
              break;
 | 
					              break;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
@ -2061,7 +2109,7 @@ bool QueryDbMainLoop(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    did_work = true;
 | 
					    did_work = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Index_OnIdMapped response(request->indexed_content);
 | 
					    Index_OnIdMapped response(request->indexed_content, request->perf);
 | 
				
			||||||
    Timer time;
 | 
					    Timer time;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    if (request->previous) {
 | 
					    if (request->previous) {
 | 
				
			||||||
@ -2071,8 +2119,8 @@ bool QueryDbMainLoop(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    assert(request->current);
 | 
					    assert(request->current);
 | 
				
			||||||
    response.current_id_map = MakeUnique<IdMap>(db, request->current->id_cache);
 | 
					    response.current_id_map = MakeUnique<IdMap>(db, request->current->id_cache);
 | 
				
			||||||
    time.ResetAndPrint("[querydb] Create IdMap " + request->current->path);
 | 
					 | 
				
			||||||
    response.current_index = std::move(request->current);
 | 
					    response.current_index = std::move(request->current);
 | 
				
			||||||
 | 
					    response.perf.querydb_id_map = time.ElapsedMicrosecondsAndReset();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    queue_on_id_mapped->Enqueue(std::move(response));
 | 
					    queue_on_id_mapped->Enqueue(std::move(response));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@ -2109,7 +2157,7 @@ bool QueryDbMainLoop(
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    db->ApplyIndexUpdate(&response->update);
 | 
					    db->ApplyIndexUpdate(&response->update);
 | 
				
			||||||
    time.ResetAndPrint("[querydb] Applying index update");
 | 
					    //time.ResetAndPrint("[querydb] Applying index update");
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return did_work;
 | 
					  return did_work;
 | 
				
			||||||
 | 
				
			|||||||
@ -6,6 +6,7 @@
 | 
				
			|||||||
#include "libclangmm/Utility.h"
 | 
					#include "libclangmm/Utility.h"
 | 
				
			||||||
#include "platform.h"
 | 
					#include "platform.h"
 | 
				
			||||||
#include "serializer.h"
 | 
					#include "serializer.h"
 | 
				
			||||||
 | 
					#include "timer.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <algorithm>
 | 
					#include <algorithm>
 | 
				
			||||||
#include <chrono>
 | 
					#include <chrono>
 | 
				
			||||||
@ -1382,6 +1383,7 @@ std::vector<std::unique_ptr<IndexFile>> Parse(
 | 
				
			|||||||
    std::vector<std::string> args,
 | 
					    std::vector<std::string> args,
 | 
				
			||||||
    const std::string& file_contents_path,
 | 
					    const std::string& file_contents_path,
 | 
				
			||||||
    const optional<std::string>& file_contents,
 | 
					    const optional<std::string>& file_contents,
 | 
				
			||||||
 | 
					    PerformanceImportFile* perf,
 | 
				
			||||||
    bool dump_ast) {
 | 
					    bool dump_ast) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (!config->enableIndexing)
 | 
					  if (!config->enableIndexing)
 | 
				
			||||||
@ -1389,6 +1391,8 @@ std::vector<std::unique_ptr<IndexFile>> Parse(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  file = NormalizePath(file);
 | 
					  file = NormalizePath(file);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Timer timer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  clang::Index index(0 /*excludeDeclarationsFromPCH*/,
 | 
					  clang::Index index(0 /*excludeDeclarationsFromPCH*/,
 | 
				
			||||||
                     0 /*displayDiagnostics*/);
 | 
					                     0 /*displayDiagnostics*/);
 | 
				
			||||||
  std::vector<CXUnsavedFile> unsaved_files;
 | 
					  std::vector<CXUnsavedFile> unsaved_files;
 | 
				
			||||||
@ -1401,6 +1405,8 @@ std::vector<std::unique_ptr<IndexFile>> Parse(
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
  clang::TranslationUnit tu(index, file, args, unsaved_files, CXTranslationUnit_KeepGoing);
 | 
					  clang::TranslationUnit tu(index, file, args, unsaved_files, CXTranslationUnit_KeepGoing);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  perf->index_parse = timer.ElapsedMicrosecondsAndReset();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (dump_ast)
 | 
					  if (dump_ast)
 | 
				
			||||||
    Dump(tu.document_cursor());
 | 
					    Dump(tu.document_cursor());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1418,13 +1424,15 @@ std::vector<std::unique_ptr<IndexFile>> Parse(
 | 
				
			|||||||
  bool is_first_ownership;
 | 
					  bool is_first_ownership;
 | 
				
			||||||
  param.primary_file = file_consumer.TryConsumeFile(cx_file, &is_first_ownership);
 | 
					  param.primary_file = file_consumer.TryConsumeFile(cx_file, &is_first_ownership);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  std::cerr << "!! [START] Indexing " << file << std::endl;
 | 
					  //std::cerr << "!! [START] Indexing " << file << std::endl;
 | 
				
			||||||
  CXIndexAction index_action = clang_IndexAction_create(index.cx_index);
 | 
					  CXIndexAction index_action = clang_IndexAction_create(index.cx_index);
 | 
				
			||||||
  clang_indexTranslationUnit(index_action, ¶m, callbacks, sizeof(callbacks),
 | 
					  clang_indexTranslationUnit(index_action, ¶m, callbacks, sizeof(callbacks),
 | 
				
			||||||
                             CXIndexOpt_IndexFunctionLocalSymbols | CXIndexOpt_SkipParsedBodiesInSession | CXIndexOpt_IndexImplicitTemplateInstantiations,
 | 
					                             CXIndexOpt_IndexFunctionLocalSymbols | CXIndexOpt_SkipParsedBodiesInSession | CXIndexOpt_IndexImplicitTemplateInstantiations,
 | 
				
			||||||
                             tu.cx_tu);
 | 
					                             tu.cx_tu);
 | 
				
			||||||
  clang_IndexAction_dispose(index_action);
 | 
					  clang_IndexAction_dispose(index_action);
 | 
				
			||||||
  std::cerr << "!! [END] Indexing " << file << std::endl;
 | 
					  //std::cerr << "!! [END] Indexing " << file << std::endl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  perf->index_build = timer.ElapsedMicrosecondsAndReset();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  auto result = param.file_consumer->TakeLocalState();
 | 
					  auto result = param.file_consumer->TakeLocalState();
 | 
				
			||||||
  for (auto& entry : result) {
 | 
					  for (auto& entry : result) {
 | 
				
			||||||
 | 
				
			|||||||
@ -6,6 +6,7 @@
 | 
				
			|||||||
#include "utils.h"
 | 
					#include "utils.h"
 | 
				
			||||||
#include "language_server_api.h"
 | 
					#include "language_server_api.h"
 | 
				
			||||||
#include "libclangmm/Utility.h"
 | 
					#include "libclangmm/Utility.h"
 | 
				
			||||||
 | 
					#include "performance.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <optional.h>
 | 
					#include <optional.h>
 | 
				
			||||||
#include <rapidjson/writer.h>
 | 
					#include <rapidjson/writer.h>
 | 
				
			||||||
@ -508,5 +509,6 @@ std::vector<std::unique_ptr<IndexFile>> Parse(
 | 
				
			|||||||
    std::vector<std::string> args,
 | 
					    std::vector<std::string> args,
 | 
				
			||||||
    const std::string& file_contents_path,
 | 
					    const std::string& file_contents_path,
 | 
				
			||||||
    const optional<std::string>& file_contents,
 | 
					    const optional<std::string>& file_contents,
 | 
				
			||||||
 | 
					    PerformanceImportFile* perf,
 | 
				
			||||||
    bool dump_ast = false);
 | 
					    bool dump_ast = false);
 | 
				
			||||||
void IndexInit();
 | 
					void IndexInit();
 | 
				
			||||||
 | 
				
			|||||||
@ -23,7 +23,7 @@ TranslationUnit::TranslationUnit(Index& index,
 | 
				
			|||||||
  for (const auto& arg : platform_args)
 | 
					  for (const auto& arg : platform_args)
 | 
				
			||||||
    args.push_back(arg.c_str());
 | 
					    args.push_back(arg.c_str());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  std::cerr << "Parsing " << filepath << " with args " << StringJoin(args) << std::endl;
 | 
					  //std::cerr << "Parsing " << filepath << " with args " << StringJoin(args) << std::endl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  //CXErrorCode error_code = clang_parseTranslationUnit2FullArgv(
 | 
					  //CXErrorCode error_code = clang_parseTranslationUnit2FullArgv(
 | 
				
			||||||
  CXErrorCode error_code = clang_parseTranslationUnit2(
 | 
					  CXErrorCode error_code = clang_parseTranslationUnit2(
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										24
									
								
								src/performance.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								src/performance.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,24 @@
 | 
				
			|||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Contains timing information for the entire pipeline for importing a file
 | 
				
			||||||
 | 
					// into the querydb.
 | 
				
			||||||
 | 
					struct PerformanceImportFile {
 | 
				
			||||||
 | 
					  // All units are in microseconds.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // [indexer] clang parsing the file
 | 
				
			||||||
 | 
					  long long index_parse = 0;
 | 
				
			||||||
 | 
					  // [indexer] build the IndexFile object from clang parse
 | 
				
			||||||
 | 
					  long long index_build = 0;
 | 
				
			||||||
 | 
					  // [querydb] create IdMap object from IndexFile
 | 
				
			||||||
 | 
					  long long querydb_id_map = 0;
 | 
				
			||||||
 | 
					  // [indexer] save the IndexFile to disk
 | 
				
			||||||
 | 
					  long long index_save_to_disk = 0;
 | 
				
			||||||
 | 
					  // [indexer] loading previously cached index
 | 
				
			||||||
 | 
					  long long index_load_cached = 0;
 | 
				
			||||||
 | 
					  // [indexer] create delta IndexUpdate object
 | 
				
			||||||
 | 
					  long long index_make_delta = 0;
 | 
				
			||||||
 | 
					  // [querydb] update WorkingFile indexed file state
 | 
				
			||||||
 | 
					  //long long querydb_update_working_file = 0;
 | 
				
			||||||
 | 
					  // [querydb] apply IndexUpdate
 | 
				
			||||||
 | 
					  //long long querydb_apply_index_update = 0;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										12
									
								
								src/timer.cc
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								src/timer.cc
									
									
									
									
									
								
							@ -6,6 +6,18 @@ Timer::Timer() {
 | 
				
			|||||||
  Reset();
 | 
					  Reset();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					long long Timer::ElapsedMicroseconds() const {
 | 
				
			||||||
 | 
					  std::chrono::time_point<Clock> end = Clock::now();
 | 
				
			||||||
 | 
					  return std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					long long Timer::ElapsedMicrosecondsAndReset() {
 | 
				
			||||||
 | 
					  std::chrono::time_point<Clock> end = Clock::now();
 | 
				
			||||||
 | 
					  long long microseconds = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
 | 
				
			||||||
 | 
					  Reset();
 | 
				
			||||||
 | 
					  return microseconds;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void Timer::Reset() {
 | 
					void Timer::Reset() {
 | 
				
			||||||
  start = Clock::now();
 | 
					  start = Clock::now();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -9,6 +9,10 @@ struct Timer {
 | 
				
			|||||||
  // Creates a new timer. A timer is always running.
 | 
					  // Creates a new timer. A timer is always running.
 | 
				
			||||||
  Timer();
 | 
					  Timer();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Returns elapsed microseconds.
 | 
				
			||||||
 | 
					  long long ElapsedMicroseconds() const;
 | 
				
			||||||
 | 
					  // Returns elapsed microseconds and restarts/resets the timer.
 | 
				
			||||||
 | 
					  long long ElapsedMicrosecondsAndReset();
 | 
				
			||||||
  // Restart/reset the timer.
 | 
					  // Restart/reset the timer.
 | 
				
			||||||
  void Reset();
 | 
					  void Reset();
 | 
				
			||||||
  // Resets timer and prints a message like "<foo> took 5ms"
 | 
					  // Resets timer and prints a message like "<foo> took 5ms"
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user