Вопрос или проблема
Какой самый быстрый способ получить все папки?
Вот что я пробую, но, похоже, это очень медленно:
App.get_bookmark_folders = async (title = ``) => {
let folders = []
let nodes = await browser.bookmarks.getTree()
let max = App.get_setting(`max_bookmark_folders`)
title = title.toLowerCase()
function traverse(bookmarks) {
for (let bookmark of bookmarks) {
if (bookmark.children) {
if (bookmark.title) {
if (bookmark.title.toLowerCase().includes(title)) {
folders.push(bookmark)
}
}
if (folders.length >= max) {
break
}
traverse(bookmark.children)
}
}
}
traverse(nodes)
return folders
}
Даже если я использую max
, чтобы ограничить результаты определенным количеством, кажется, что обрабатывается все это.
Какой самый быстрый способ?
Ответ или решение
Для оптимизации процесса получения всех папок закладок в вашем расширении для Firefox, можно попробовать несколько усовершенствований в вашей функции App.get_bookmark_folders
. Давайте рассмотрим шаги, которые позволят улучшить производительность и минимизировать время обработки:
-
Использование
Promise
для асинхронности: В JavaScript работа с асинхронными функциями может привести к улучшению производительности. Убедитесь, что вы правильно используетеasync/await
. -
Остановка обхода по дереву: В текущем варианте вы продолжаете рекурсию даже после достижения максимального количества найденных папок. Это можно улучшить, чтобы прекратить обход, как только будет найдено требуемое количество папок.
-
Минимизация использования
toLowerCase()
: Вместо вызоваtoLowerCase()
для каждого заголовка в цикле, вы можете преобразовать вашtitle
один раз вне цикла и использовать его для сравнения.
Вот улучшенная версия вашей функции:
App.get_bookmark_folders = async (title = ``) => {
let folders = [];
let nodes = await browser.bookmarks.getTree();
let max = App.get_setting(`max_bookmark_folders`);
title = title.toLowerCase(); // Преобразуем один раз
function traverse(bookmarks) {
for (let bookmark of bookmarks) {
if (folders.length >= max) {
break; // Прекратить обход, если достигли максимума
}
if (bookmark.children) {
if (bookmark.title && bookmark.title.toLowerCase().includes(title)) {
folders.push(bookmark);
}
traverse(bookmark.children); // Рекурсивный вызов для дочерних элементов
}
}
}
traverse(nodes);
return folders;
}
Объяснение изменений:
- Ранний выход из функции: После проверки, превышает ли число найденных папок максимальное значение (
max
), функция немедленно завершает обход, что снижает общее время обработки. - Упрощение преобразования в нижний регистр: Мы сокращаем количество вызовов
toLowerCase()
, преобразуя целевойtitle
один раз перед началом обхода.
Дополнительные рекомендации:
- Если у вас есть возможность обрабатывать данные параллельно, подумайте о том, как можно дополнительно оптимизировать функцию с помощью
Promise.all()
для обработки больших объемов данных. - Также рассмотрите возможность применения фильтрации при получении данных из API закладок, если это возможно, для сокращения количества получаемых элементов.
Эти изменения должны помочь значительно ускорить вашу функцию для получения папок закладок в расширении Firefox.