CudaText: Expanding a folder in project_man slow
Работаю с CMS Bitrix, в нем есть папка /bitrix/components/bitrix/
, и в этой папке лежит около 400 папок, без файлов. Дома на компьютере с SSD раскрытие папки около 170-300 мс (измеряю время выполнения функции action_rerfresh()), чем больше файлов/папок тем медленнее. На работе компонентов больше, и диск медленнее, там это заметнее.
Попытался исправить сам. Первым делом вставил if i % 10 == 0: app_idle()
, так интерфейс не замораживается, но время перед открытием папки увеличивается.
Потом добавил TREE_LOCK, по коду ниже это есть, задержка стала 90-190 мс, но все равно ощущается, в SublimeText ее нету, достичь бы такого же поведения…
# /py/cuda_project_man/__init__.py
# line: 492
def action_refresh(self, parent=None):
unfold = parent is None
if parent is None:
# clear tree
tree_proc(self.tree, TREE_ITEM_DELETE, 0)
if self.project_file_path is None:
project_name = PROJECT_UNSAVED_NAME
else:
project_name = self.project_file_path.stem
parent = tree_proc(
self.tree,
TREE_ITEM_ADD,
0,
-1,
project_name,
self.ICON_PROJ,
)
#select 1st node
items_root = tree_proc(self.tree, TREE_ITEM_ENUM, 0)
tree_proc(self.tree, TREE_ITEM_SELECT, items_root[0][0])
nodes = self.project["nodes"]
self.top_nodes = {}
else:
fn = self.get_location_by_index(parent)
if not fn: return
#print('Reading dir:', fn)
try:
nodes = sorted(Path(fn).iterdir(), key=Command.node_ordering)
except:
tree_proc(self.tree, TREE_ITEM_SET_ICON, parent, image_index=self.ICON_BAD)
return
new_nodes = []
for path in map(Path, nodes):
spath = str(path)
sname = path.name
if is_win_root(spath):
sname = spath
elif self.options.get("no_hidden", True) and is_hidden(spath):
continue
elif self.is_filename_ignored(spath):
continue
if is_locked(spath):
imageindex = self.ICON_BAD
elif path.is_dir():
imageindex = self.ICON_DIR
elif is_simple_listed(path.name, MASKS_IMAGES):
imageindex = self.ICON_IMG
elif is_simple_listed(path.name, MASKS_ZIP):
imageindex = self.ICON_ZIP
elif is_simple_listed(path.name, MASKS_BINARY):
imageindex = self.ICON_BIN
else:
lexname = lexer_proc(LEXER_DETECT, path.name)
if lexname:
imageindex = self.icon_get(lexname)
else:
imageindex = self.ICON_ALL
new_nodes.append({
'sname': sname,
'imageindex': imageindex,
'spath': spath
})
###################################################
tree_proc(self.tree, TREE_LOCK)
for new_node in new_nodes:
index = tree_proc(
self.tree,
TREE_ITEM_ADD,
parent,
-1,
new_node['sname'],
new_node['imageindex'],
data=new_node['spath'],
)
if nodes is self.project['nodes']:
self.top_nodes[index] = path
# dummy nested node for folders
if new_node['imageindex'] == self.ICON_DIR:
tree_proc(
self.tree,
TREE_ITEM_ADD,
index,
-1,
'dummy',
-1
)
tree_proc(self.tree, TREE_UNLOCK)
###################################################
if unfold:
tree_proc(self.tree, TREE_ITEM_UNFOLD, parent)
About this issue
- Original URL
- State: closed
- Created 3 years ago
- Comments: 17 (17 by maintainers)
Commits related to this issue
- ProjMan: add tree_lock/_unlock calls, #3603 — committed to Alexey-T/CudaText by Alexey-T 3 years ago
- more for #3603 — committed to Alexey-T/CudaText by Alexey-T 3 years ago
Тормозят системные вызовы
is_file
иis_dir
, неtree_proc
.Если возможно (не уверен) переделать это
Path(fn).iterdir()
наos.scandir
- должно быть значительно быстрее. У меняPath.iterdir
+is_dir
на большой папке занимает 140 мс, аos.scandir
+is_dir
- 18 мс.У меня функция action_refresh_int на тестовой папке отрабатывает 0.03с, хороший результат
оптимизировал- тепеорь is_dir() не дергается лишние разы в is_filename_ignored(). проверьте плиз.