From 6da481205b66c4c70d29bef4052e5345a73112c5 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Tue, 25 May 2021 20:53:59 +0200 Subject: [PATCH] LibTest: Use fstatat() to speed up iterate_directory_recursively() Employ the same technique as SpaceAnalyzer to avoid doing full path resolution in the kernel over an over. Starting each path resolution from the base of the directory iterator (using its fd) is significantly faster and reduces test-js runtime by ~3%. --- .../Libraries/LibTest/JavaScriptTestRunner.h | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/Userland/Libraries/LibTest/JavaScriptTestRunner.h b/Userland/Libraries/LibTest/JavaScriptTestRunner.h index 1aa788badf..62f5d68143 100644 --- a/Userland/Libraries/LibTest/JavaScriptTestRunner.h +++ b/Userland/Libraries/LibTest/JavaScriptTestRunner.h @@ -2,6 +2,7 @@ * Copyright (c) 2020, Matthew Olsson * Copyright (c) 2020-2021, Linus Groh * Copyright (c) 2021, Ali Mohammad Pur + * Copyright (c) 2021, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ @@ -26,6 +27,7 @@ #include #include #include +#include #include #include @@ -201,12 +203,16 @@ inline void iterate_directory_recursively(const String& directory_path, Callback Core::DirIterator directory_iterator(directory_path, Core::DirIterator::Flags::SkipDots); while (directory_iterator.has_next()) { - auto file_path = directory_iterator.next_full_path(); - auto is_directory = Core::File::is_directory(file_path); - if (is_directory && !file_path.contains("/Fixtures")) { - iterate_directory_recursively(file_path, callback); + auto name = directory_iterator.next_path(); + struct stat st = {}; + if (fstatat(directory_iterator.fd(), name.characters(), &st, AT_SYMLINK_NOFOLLOW) < 0) + continue; + bool is_directory = S_ISDIR(st.st_mode); + auto full_path = String::formatted("{}/{}", directory_path, name); + if (is_directory && name != "/Fixtures"sv) { + iterate_directory_recursively(full_path, callback); } else if (!is_directory) { - callback(move(file_path)); + callback(full_path); } } }