diff options
author | Eric Liu <ioeric@google.com> | 2018-10-02 10:43:55 +0000 |
---|---|---|
committer | Eric Liu <ioeric@google.com> | 2018-10-02 10:43:55 +0000 |
commit | 7842148d30d3725fcf927fa3bc1c48ec013ac4e0 (patch) | |
tree | bb09ac597cbfe33e7178da9c6280e7a0f1e8f9d0 /clang-tools-extra/unittests/clangd/FSTests.cpp | |
parent | cd2df21b7186035ae9900088a9613426f57b707c (diff) |
[clangd] Cache FS stat() calls when building preamble.linaro-local/ci/tcwg-llvm-kernel-baseline-armv8l-release-stablelinaro-local/ci/tcwg-llvm-kernel-baseline-armv8l-release-nextlinaro-local/ci/tcwg-llvm-kernel-baseline-armv8l-release-ltslinaro-local/ci/tcwg-llvm-kernel-baseline-aarch64-release-nextlinaro-local/ci/llvm-kernel-armv8l-baselinelinaro-local/ci/llvm-kernel-aarch64-baseline
Summary:
The file stats can be reused when preamble is reused (e.g. code
completion). It's safe to assume that cached status is not outdated as we
assume preamble files to remain unchanged.
On real file system, this made code completion ~20% faster on a measured file
(with big preamble). The preamble build time doesn't change much.
Reviewers: sammccall, ilya-biryukov
Reviewed By: sammccall
Subscribers: mgorny, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D52419
Diffstat (limited to 'clang-tools-extra/unittests/clangd/FSTests.cpp')
-rw-r--r-- | clang-tools-extra/unittests/clangd/FSTests.cpp | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/clang-tools-extra/unittests/clangd/FSTests.cpp b/clang-tools-extra/unittests/clangd/FSTests.cpp new file mode 100644 index 00000000000..3b028426016 --- /dev/null +++ b/clang-tools-extra/unittests/clangd/FSTests.cpp @@ -0,0 +1,46 @@ +//===-- FSTests.cpp - File system related tests -----------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "FS.h" +#include "TestFS.h" +#include "gmock/gmock.h" +#include "gtest/gtest.h" + +namespace clang { +namespace clangd { +namespace { + +TEST(FSTests, PreambleStatusCache) { + llvm::StringMap<std::string> Files; + Files["x"] = ""; + Files["y"] = ""; + auto FS = buildTestFS(Files); + FS->setCurrentWorkingDirectory(testRoot()); + + PreambleFileStatusCache StatCache; + auto ProduceFS = StatCache.getProducingFS(FS); + EXPECT_TRUE(ProduceFS->openFileForRead("x")); + EXPECT_TRUE(ProduceFS->status("y")); + + EXPECT_TRUE(StatCache.lookup(testPath("x")).hasValue()); + EXPECT_TRUE(StatCache.lookup(testPath("y")).hasValue()); + + vfs::Status S("fake", llvm::sys::fs::UniqueID(0, 0), + std::chrono::system_clock::now(), 0, 0, 1024, + llvm::sys::fs::file_type::regular_file, llvm::sys::fs::all_all); + StatCache.update(*FS, S); + auto ConsumeFS = StatCache.getConsumingFS(FS); + auto Cached = ConsumeFS->status(testPath("fake")); + EXPECT_TRUE(Cached); + EXPECT_EQ(Cached->getName(), S.getName()); +} + +} // namespace +} // namespace clangd +} // namespace clang |