Ru-Board.club
← Вернуться в раздел «Тестирование»

» Far Manager - скрипты и плагины

Автор: Alexyz21
Дата сообщения: 25.05.2016 11:24
shmuz2
Спасибо. в последнем билде не тестил, но в 4671 при выдаче ошибок в moon-скриптах, номера строк не совпадают с реальными строками, в которых допущена ошибка. Утверждать не берусь, поскольку специально не тестировал одинаковые ошибки в одном и том же скрипте, исполненов в lua и moon, но сложилось впечатление, что при ошибках в обращении к API происходит полный вылет после кучи сообщений об ошибке, в то время как в lua в похожих случаях вылеты редки, окно об ошибке одно, после которого удаётся вернуться в Фар.
Автор: shmuz2
Дата сообщения: 25.05.2016 11:31
Alexyz21

Цитата:
при выдаче ошибок в moon-скриптах, номера строк не совпадают с реальными строками, в которых допущена ошибка

Это возможно, но без тест-кейса больше сказать нечего. И полагаю, что номер билда Фара за последние минимум полгода не имеет отношения к этому.
Автор: Angel_Ka
Дата сообщения: 25.05.2016 19:55
Alexyz21

Сегодня удалось поупражняться на реальной безе на 1.841.579 файлов.
Формирование первичного списка — 60 сек, отчётного — 190 сек.

Таким образом, подтверждается, что изначальная задача успешно решается. Постараюсь на этой неделе добраться и до 3-миллионной базы.

Очень я доволен макросом. И бесконечно Вам благодарен за его создание и shmuz2 за большую помощь в этом!
Автор: Angel_Ka
Дата сообщения: 25.05.2016 22:32
Таким образом вполне подтверждается, что с промежуточной обработкой бранч-списка базы файлов в редакторе на предмет выявления в ней полных и частичных дубликатов процесс в целом проходит намного быстрее, чем при только непосредственной работе с бранчем во временной панели.

На примере базы из 1,8 миллионов файлов:

При лобовом варианте работы прямо с бранч-панелью, только на создание самого бранча уходит полтора часа, т.е. 5.400 секунд. Обработка бранча макросом Select Duplicates FileName in Branch panel занимает меньше пары десятков секунд. И создание отчётного бранч-списка по шорткату AltShiftF2 ещё с десяток секунд.

При обходном же варианте на создание первичного бранч-списка макросом Filter Duplicates FileName in Editor уходит 60 секунд и ещё на создание отчётного бранч-списка этим же макросом — 190 секунд. Т.е. всего 250 секунд.

Получается, что обходной вариант в 20 раз быстрее. Или я чего-то упустил?
Автор: Alexyz21
Дата сообщения: 26.05.2016 09:30
PSDFN 13.2.1 Final [more]
Код: -- 13.2.1
local guid = "FE9B8874-9651-434C-8182-72329F2371A5"
local uGuid = win.Uuid(guid)
local freport = win.GetEnv("Temp").."\\Report.txt"

local F = far.Flags
local ffi = require'ffi'
local C = ffi.C
local NULL = ffi.cast("void*",0)
local PANEL_ACTIVE = ffi.cast("HANDLE",-1)
local pBL0,pBL1 = ffi.cast("BOOL*",0),ffi.cast("BOOL*",1)
local PanelMode,Desc1,Indi1 = 999,"Select duplicates","!?"
local BS,ts = string.byte("\\"),{nil,true,9999,true,false,2,2,true,false}
local Flags = C.SORT_STRINGSORT

local function GetStartAndLenW(name)
local ptr = C.wcsrchr(name,BS)
name = ptr==nil and name or ptr+1
local len = tonumber(C.wcslen(name))
if ts[2] and ts[3]<0 and -ts[3]<len then
local res=ffi.new("wchar_t[?]",len+1)
ffi.copy(res,name+len+ts[3],-ts[3]*2)
ffi.copy(res-ts[3],name,(len+ts[3])*2)
return res,len
else
return name,len
end
end

local function StartAndLenW(name)
local ptr = C.wcsrchr(name,BS)
name = ptr==nil and name or ptr+1
local len = tonumber(C.wcslen(name))
if ts[2] and ts[3]<0 and -ts[3]<len then
return name+len+ts[3],-ts[3],name,len
elseif ts[2] and ts[3]>0 and ts[3]<len then
return name,ts[3],name,len
else
return name,len,name,len
end
end

local Compare = function(p1,p2)
local st1,ln1 = GetStartAndLenW(p1.FileName)
local st2,ln2 = GetStartAndLenW(p2.FileName)
local res = -2 + C.CompareStringW(C.LOCALE_USER_DEFAULT,Flags,st1,ln1,st2,ln2)
local sz1,sz2,fa1,fa2
if ts[6]~=2 then sz1,sz2 = tonumber(p1.FileSize),tonumber(p2.FileSize) end
if ts[7]~=2 then fa1,fa2 = tonumber(p1.FileAttributes),tonumber(p2.FileAttributes) end
if res==0 and sz1 then res=sz1-sz2 end
if res==0 and fa1 then res=fa1-fa2 end
return res<0 and -1 or res>0 and 1 or 0
end

local Items = {
--[[01]] {F.DI_DOUBLEBOX, 3,1, 65,9, 0, 0,0, 0, "Select duplicates of FileName. Help: F1"},
--[[02]] {F.DI_CHECKBOX, 5,2, 26,2, 0, 0,0, 0, "Num&ber of symbols"},
--[[03]] {F.DI_EDIT, 27,2, 32,2, 0, 0,0, 0, ""},
--[[04]] {F.DI_CHECKBOX, 5,3, 20,3, 0, 0,0, 0, "Ignore &case"},
--[[05]] {F.DI_CHECKBOX, 38,3, 62,3, 0, 0,0, 0, "Ignore Full &Duplicates"},
--[[06]] {F.DI_CHECKBOX, 5,4, 21,4, 0, 0,0, F.DIF_3STATE, "&Sizes of FD:"},
--[[07]] {F.DI_CHECKBOX, 5,5, 26,5, 0, 0,0, F.DIF_3STATE, "&Attributes of FD:"},
--[[08]] {F.DI_CHECKBOX, 5,6, 35,6, 0, 0,0, 0, "Accuracy (&two-pass method)"},
--[[09]] {F.DI_CHECKBOX, 5,8, 15,8, 0, 0,0, 0, "Re&port"},
--[[10]] {F.DI_TEXT, -1,7, 0,0, 0, 0,0, F.DIF_SEPARATOR,""},
--[[11]] {F.DI_BUTTON, 0,8, 0,0, 0, 0,0, F.DIF_DEFAULTBUTTON+F.DIF_CENTERGROUP,"&Ok"},
--[[12]] {F.DI_BUTTON, 0,8, 0,0, 0, 0,0, F.DIF_CENTERGROUP,"Ca&ncel"}
}

local tts={}

local function DlgProc(hDlg,Msg,Param1,Param2)
if Msg==F.DN_INITDIALOG then
for i=2,#Items-3 do tts[i]=ts[i] end
hDlg:send(F.DM_SETTEXT,3,tts[3])
hDlg:send(F.DM_SETCHECK,2,tts[2] and F.BSTATE_CHECKED or F.BSTATE_UNCHECKED)
hDlg:send(F.DM_SETCHECK,4,tts[4] and F.BSTATE_CHECKED or F.BSTATE_UNCHECKED)
hDlg:send(F.DM_SETCHECK,5,tts[5] and F.BSTATE_CHECKED or F.BSTATE_UNCHECKED)
hDlg:send(F.DM_SETCHECK,6,tts[6]==0 and F.BSTATE_UNCHECKED or tts[6]==1 and F.BSTATE_CHECKED or tts[6]==2 and F.BSTATE_3STATE)
hDlg:send(F.DM_SETTEXT,6,"&Sizes of FD: "..(tts[6]==0 and "<>" or tts[6]==1 and "==" or "--"))
hDlg:send(F.DM_SETCHECK,7,tts[7]==0 and F.BSTATE_UNCHECKED or tts[7]==1 and F.BSTATE_CHECKED or tts[7]==2 and F.BSTATE_3STATE)
hDlg:send(F.DM_SETTEXT,7,"&Attributes of FD: "..(tts[7]==0 and "<>" or tts[7]==1 and "==" or "--"))
hDlg:send(F.DM_SETCHECK,8,tts[8] and F.BSTATE_CHECKED or F.BSTATE_UNCHECKED)
hDlg:send(F.DM_SETCHECK,9,tts[9] and F.BSTATE_CHECKED or F.BSTATE_UNCHECKED)
elseif Msg==F.DN_BTNCLICK and (Param1==2 or Param1==4 or Param1==5 or Param1==8 or Param1==9) then
tts[Param1] = Param2~=0
elseif Msg==F.DN_BTNCLICK and (Param1==6 or Param1==7) then
tts[Param1] = Param2
hDlg:send(F.DM_SETTEXT,Param1,(Param1==6 and "&Sizes of FD: " or "&Attributes of FD: ")..(Param2==0 and "<>" or Param2==1 and "==" or "--"))
elseif Msg==F.DN_EDITCHANGE and Param1==3 then -- Number symbols
tts[3] = tonumber(hDlg:send(F.DM_GETTEXT,3)) or tts[3]
else
return
end
return true
end

Macro {
description="! Select Duplicates FileName in Branch panel"; name="PSDFN"; area="Shell";
action=function()
if far.Dialog(uGuid,-1,-1,69,11,nil,Items,nil,DlgProc)==#Items-1 then
local t0=far.FarClock()
for i=2,#Items-3 do ts[i]=tts[i] end
Flags = ts[4] and bit.bor(Flags,C.NORM_IGNORECASE) or bit.band(Flags,bit.bnot(C.NORM_IGNORECASE))
--local PInfo=panel.GetPanelInfo(nil,1)
local PInfo=ffi.new("struct PanelInfo")
PInfo.StructSize=ffi.sizeof(PInfo)
local pc=ffi.cast("struct PluginStartupInfo*",far.CPluginStartupInfo()).PanelControl
if pc(PANEL_ACTIVE,"FCTL_GETPANELINFO",0,PInfo)==1 then
local pin,pif = tonumber(PInfo.ItemsNumber),tonumber(PInfo.Flags)
if pin>1 then
if bit.band(pif,F.PFLAGS_SELECTEDFIRST)>0 then Keys("ShiftF12") end
if bit.band(pif,F.PFLAGS_NUMERICSORT)>0 then pc(PANEL_ACTIVE,"FCTL_SETNUMERICSORT",0,NULL) end
local pfcss=bit.band(pif,F.PFLAGS_CASESENSITIVESORT)==0
if ts[4] and not pfcss or not ts[4] and pfcss then pc(PANEL_ACTIVE,"FCTL_SETCASESENSITIVESORT",ts[4] and 0 or 1,NULL) end
if bit.band(pif,F.PFLAGS_REVERSESORTORDER)==0 then pc(PANEL_ACTIVE,"FCTL_SETSORTORDER",1,NULL) end
Panel.LoadCustomSortMode(PanelMode,{Description=Desc1;Indicator=Indi1;Compare=Compare})
Panel.SetCustomSortMode(PanelMode,0)
local st0,ln0,st1,ln1,st2,ln2,st3,ln3,sz0,sz1,fa0,fa1 = nil
local ppi = ffi.new("struct FarGetPluginPanelItem")
ppi.StructSize = ffi.sizeof("struct FarGetPluginPanelItem")
local function PGPI(i)
ppi.Size = pc(PANEL_ACTIVE,"FCTL_GETPANELITEM",i,NULL)
if ppi.Size~=0 then
local buf = ffi.new("char[?]",ppi.Size)
ppi.Item = ffi.cast("struct PluginPanelItem*",buf)
pc(PANEL_ACTIVE,"FCTL_GETPANELITEM",i,ppi)
st1,ln1,st3,ln3=StartAndLenW(ffi.cast("const unsigned short*",ppi.Item.FileName))
if ts[6] then sz1=tonumber(ppi.Item.FileSize) end
if ts[7] then fa1=tonumber(ppi.Item.FileAttributes) end
end
end
PGPI(0)
pc(PANEL_ACTIVE,"FCTL_BEGINSELECTION",0,NULL)
for i=1,pin-1 do
st0,ln0,st2,ln2,sz0,fa0 = st1,ln1,st3,ln3,sz1,fa1
PGPI(i)
if C.CompareStringW(C.LOCALE_USER_DEFAULT,Flags,st0,ln0,st1,ln1)==2 then
local x=C.CompareStringW(C.LOCALE_USER_DEFAULT,Flags,st2,ln2,st3,ln3)==2
local y=(ts[6]==0 and sz0~=sz1 or ts[6]==1 and sz0==sz1 or ts[6]==2)
and (ts[7]==0 and fa0~=fa1 or ts[7]==1 and fa0==fa1 or ts[7]==2)
if not ts[5] and (not ts[2] and x and y or ts[2] and y)
or ts[5] and (ts[6]==0 and sz0==sz1 or ts[6]==1 and sz0~=sz1)
and (ts[7]==0 and fa0==fa1 or ts[7]==1 and fa0~=fa1)
then
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-1,pBL1)
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i,pBL1)
end
end
end
if ts[8] then
st0,ln0,st1,ln1,st2,ln2,st3,ln3,sz0,sz1,fa0,fa1 = nil
PGPI(0)
for i=1,pin-1 do
st0,ln0,st2,ln2,sz0,fa0 = st1,ln1,st3,ln3,sz1,fa1
PGPI(i)
if (((ts[5] and ts[6]==1 or not ts[5] and ts[6]==0) and sz0==sz1)
or ((ts[5] and ts[7]==1 or not ts[5] and ts[7]==0) and fa0==fa1))
and C.CompareStringW(C.LOCALE_USER_DEFAULT,Flags,st2,ln2,st3,ln3)==2
then
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i-1,pBL0)
pc(PANEL_ACTIVE,"FCTL_SETSELECTION",i,pBL0)
end
end
end
pc(PANEL_ACTIVE,"FCTL_ENDSELECTION",0,NULL)
pc(PANEL_ACTIVE,"FCTL_REDRAWPANEL",0,NULL)
if ts[9] then
local pisel,pisin=""
if pc(PANEL_ACTIVE,"FCTL_GETPANELINFO",0,PInfo)==1 then
pisin=tonumber(PInfo.SelectedItemsNumber)
pisel=tostring(pisin==1 and 0 or pisin).."/"..tostring(tonumber(PInfo.ItemsNumber))
end
local h = io.open(freport,"w+b")
h:write("Items: "..pisel..
"\nExecution time: "..(far.FarClock()-t0)..
" mcs\nNumber of symbols: "..(ts[2] and ts[3] or "all")..
"\nIgnore case: "..tostring(ts[4])..
"\nIgnore Full Duplicates: "..tostring(ts[5])..
"\nSizes of FD: "..(ts[6]==0 and "<>" or ts[6]==1 and "==" or "--")..
"\nAttributes of FD: "..(ts[7]==0 and "<>" or ts[7]==1 and "==" or "--")..
"\nAccuracy (two-pass method): "..tostring(ts[8])..
"\n"..string.rep("-",30).."\n")
local function PGPSI(i)
ppi.Size = pc(PANEL_ACTIVE,"FCTL_GETSELECTEDPANELITEM",i,NULL)
if ppi.Size~=0 then
local buf = ffi.new("char[?]",ppi.Size)
ppi.Item = ffi.cast("struct PluginPanelItem*",buf)
pc(PANEL_ACTIVE,"FCTL_GETSELECTEDPANELITEM",i,ppi)
h:write(
tostring(tonumber(ppi.Item.FileAttributes)).."\t"..
tostring(tonumber(ppi.Item.FileSize)).."\t"..
win.Utf16ToUtf8(ffi.string(ppi.Item.FileName,C.wcslen(ppi.Item.FileName)*2)).."\n")
end
end
if pisin then for i=0,pisin-1 do PGPSI(i) end end
io.close(h)
far.Message("mcs: "..far.FarClock()-t0,"PSDFN")
end
end
end
end
end;
}

Macro {
description = "PSDFN - Help"; area = "Dialog"; key = "F1";
condition=function() return Area.Dialog and Dlg.Id==guid end;
action=function()
if Dlg.CurPos<=3 then far.Message("The number of first or last symbols to compare","Help: Number of symbols")
elseif Dlg.CurPos==4 then far.Message("Case of letters in FileName will be ignored","Help: Ignore case")
elseif Dlg.CurPos==5 then far.Message("Full duplicates of FileName will be ignored","Help: Ignore Full Duplicates")
elseif Dlg.CurPos==6 then far.Message("-- ignore, == equal, <> is not equal","Help: Sizes of FD")
elseif Dlg.CurPos==7 then far.Message("-- ignore, == equal, <> is not equal","Help: Attributes of FD")
elseif Dlg.CurPos==8 then far.Message("Two-pass method for\n<> (is not equal) options only","Help: Accuracy")
elseif Dlg.CurPos==9 then far.Message("mcs - total time of execution in mcs\nReport will be saved to:\n"..freport,"Help: Report",nil,"l")
end
end;
}
Автор: shmuz2
Дата сообщения: 26.05.2016 10:30
Alexyz21
Каждый раз, когда вызывается функция Far API, это поле должно содержать размер структуры. Но если у вас в цикле это поле не модифицируется, можно его заполнять один раз перед вхождением в цикл.
Автор: Alexyz21
Дата сообщения: 26.05.2016 10:42
Т.е. при изменении содержимого панели размер изменяется? - надо посмотреть.
Автор: shmuz2
Дата сообщения: 26.05.2016 10:52
Alexyz21

Цитата:
Т.е. при изменении содержимого панели размер изменяется?

Это неверно, и я такого не говорил.
Автор: Alexyz21
Дата сообщения: 26.05.2016 10:54
тогда перефразирую:
из-за чего может измениться размер структуры и может ли он измениться в процессе выполнения скрипта?

Добавлено:
посмотрел - 12, видимо потому, что size_t 4 байта 2 раза + указатель 4 байта (x86). Но тогда получается, что размер неизменен - зачем же держать его в цикле? - Непонятно.
Автор: shmuz2
Дата сообщения: 26.05.2016 11:49

Цитата:
тогда перефразирую:
из-за чего может измениться размер структуры и может ли он измениться в процессе выполнения скрипта?

Размер структуры не может измениться. А значение поля StructSize может, если код кривой, например.
На эту тему всё.
Автор: Angel_Ka
Дата сообщения: 26.05.2016 16:59
Alexyz21
БОЛЬШОЕ СПАСИБО за настойчивое совершенствование макросов!

Цитата:
EFDFN 1.2.1 Final … правки мизерны, тестировать не нужно, достаточно проверить, что вообще работает.

Данный макрос вполне работает. И обращаться с ним очень удобно. Благодарю Вас!

Цитата:
PSDFN 13.2.1 Final ... в отчёт выводятся выбранные файлы на панели в формате EFDFN.

К сожалению сегодня так сложилось, что не было возможности посмотреть макрос даже на хотя бы относительно крупной базе. Поэтому пока ограничился только микротестом.
В нём в режиме
Код: [x] Number of symbols 34
[x] Ignore case [x] Ignore Full Duplicates
[x] Sizes of FD: ==
[x] Attributes of FD: ==
[x] Accuracy (two-pass method)
Автор: Alexyz21
Дата сообщения: 26.05.2016 17:48
Angel_Ka
см. 196-ю строку, должно быть: if pisin then for i=0,pisin-1 do PGPSI(i) end end
Автор: Angel_Ka
Дата сообщения: 26.05.2016 18:17
Alexyz21

if pisin then for i=1,pisin do PGPSI(i) end end — было в строке 198.
if pisin then for i=0,pisin-1 do PGPSI(i) end end — стало теперь в соответствии с Вашим указанием.

И теперь в Report.txt ожидаемые 4 файла.

Большое спасибо за подсказку!
Автор: shmuz2
Дата сообщения: 26.05.2016 19:41
Нужно так называть переменные, чтобы было интересно читать программу. К имени pisin можно добавить ещё несколько из той же оперы.

Добавлено:
Кстати, LuaJIT допускает практически любые идентификаторы в UTF-8. Поэтому переменную можно назвать Писин (типа фамилия такая).
Автор: Angel_Ka
Дата сообщения: 27.05.2016 08:42
shmuz2

А производное от аббревиатуры PC бытовое словечко "писюк" Вас тоже смущает?

Анекдот:
Иногда между собой подчинённые зовут своего начальника Мирный герцог (peace duke).
Автор: shmuz2
Дата сообщения: 27.05.2016 10:00
Angel_Ka
Это была критика выбора имени переменной (надеюсь автор не обиделся). Хочешь не хочешь, а ассоциация с известным детским словом будет всплывать при чтении программы. А это ни к чему, только мешать будет.
Автор: Alexyz21
Дата сообщения: 27.05.2016 10:03
Angel_Ka

Цитата:
А производное от аббревиатуры PC бытовое словечко "писюк" Вас тоже смущает?

Уверен, что не смущает. Но писюк было дано с умыслом, также как и пентюк, хулер и пр. Человек, а русский человек в особенности, любит раскрашивать окружающую действительность, разнообразя язык и его словоформы.

Добавлено:
кстати, 198-я потому, что не последняя версия, она после того была обновлена, см. время модификации сообщения.
Автор: VictorVG4
Дата сообщения: 27.05.2016 15:13
Angel_Ka

Для смеха:

80-е, троллейбус, едут два приятеля:

- ну как твой писюк? Висит?

народ подвигается,

- висит, и даже три пальца не помогают!

народ шарахается...
Автор: Angel_Ka
Дата сообщения: 27.05.2016 16:46
shmuz2

Цитата:
Хочешь не хочешь, а ассоциация с известным детским словом будет всплывать при чтении программы.

Смею Вас заверить, что это вовсе не обязательно. В моём дошкольном детстве мы дружили лестничной клеткой, а бабушка двух наших ровесников отсидела срок и её речь была буквально перенасыщена матами. И это мне здорово помогло, потому что из-за такого опыта я никогда в жизни не воспринимал эту часть русской речи как содержательную. А лишь исключительно как эмоционально-энергетическую окраску сказанному. И до сих пор слыша подобные фразы я рефлексивно отключаюсь от их осмысления и только прицениваюсь — действительно ли там соответственный накал или лишь позёрская симуляция его.

Alexyz21

Цитата:
198-я потому, что не последняя версия, она после того была обновлена, см. время модификации сообщения

Обновление то я заметил сразу. Но 198-ой то она оказалась ещё раньше. А дело в том, что строку
Код: description="! Select Duplicates FileName in Branch panel"; name="PSDFN"; area="Shell";
Автор: Angel_Ka
Дата сообщения: 28.05.2016 16:26
shmuz2 и Alexyz21

Докладываю вам:

В основное рабочее время возможности не было совсем, занимался другим делом. Поэтому сегодня с помощью робокопи сделал эмулятор, вкупе с вкраплёнными небольшими раельными базами состоящий из 3.683.855 файлов. И наблюдал работу макросов на нём в целом и по частям.

Во-первых и в главных, макросы (и макрос от Alexyz21, комплексный, и макрос от shmuz2, создающий бранч-файл в старом стиле — без атрибутов и размеров файлов) с базой более чем в 3,5 миллиона файлов справляются без сбоев и очень быстро. Макрос от shmuz2 создаёт простой бранч-список за 120 секунд, а от Alexyz21 — расширенный за 315 секунд. Обработку списка в режиме "[x] Number of symbols 34 [ ] Ignore case [ ] Ignore Full Duplicates [x] Sizes of FD: == [x] Attributes of FD: == [ ] Accuracy (two-pass method)" макрос производит за 130 секунд.

Кроме того, проявилось ещё одно, помимо более высокой скорости работы, превосходство обоих макросов в части создания бранч-списков по сравнению с консольными вариантами команды Dir. А именно — консольная команда пропускает файлы, полное имя которых длиннее установленной величины, а ваши макросы создают полноценные списки.

Очень я доволен достигнутыми результатами и бесконечно благодарен вам за это!
Автор: shmuz2
Дата сообщения: 28.05.2016 18:09
Angel_Ka

Цитата:
А именно — консольная команда пропускает файлы, полное имя которых длиннее установленной величины, а ваши макросы создают полноценные списки.

Это заслуга фаровской функции FarRecursiveSearch, которая в конечном счёте вызывается. Так что ваше спасибо следует по цепочке передать дальше.
Автор: Alexyz21
Дата сообщения: 28.05.2016 19:44

Цитата:
Макрос от shmuz2 создаёт простой бранч-список за 120 секунд, а от Alexyz21 — расширенный за 315 секунд.

Не подтверждаю - протестировал - при одинаковых флагах (7) EFDFN тратит на создание расширенного списка на 10% больше времени, а не на 160%. Тестировал на кэшированных 97.000 файлах, расположенных внутри 6-и папок-симлинков.
Автор: Angel_Ka
Дата сообщения: 28.05.2016 20:05
shmuz2

Цитата:
Это заслуга фаровской функции FarRecursiveSearch, которая в конечном счёте вызывается. Так что ваше спасибо следует по цепочке передать дальше.

Очень хорошо! С удовольствием передаю БЛАГОДАРНОСТЬ создателям сей замечательной функции!

Alexyz21

Цитата:
Не подтверждаю

Хорошо. Поупражняюсь ещё и доложусь.
Автор: Alexyz21
Дата сообщения: 28.05.2016 20:11
Angel_Ka

Цитата:
Хорошо. Поупражняюсь ещё и доложусь.

Сначала нужно: либо "FRS_RECUR" заменить на 7, либо в EFDFN из F.FRS_RETUPDIR+F.FRS_RECUR+F.FRS_SCANSYMLINK оставить только F.FRS_RECUR, и замерять со 2-й попытки, чтобы файлы закэшировались.

Добавил в MFL вывод полей атрибутов и размера
Код: fp:write(item.FileAttributes,"\t",item.FileSize,"\t",fullpath,"\n")
Автор: Angel_Ka
Дата сообщения: 28.05.2016 21:25
Alexyz21

К своему стыду, я понял только, что нужно замерять со второй попытки. Так и делал. А остальное я совсем не понял. Что именно и где нужно заменить мне тогда как новобранцу объясните. Типа: "делай раз", "делай два" и т.д.

А пока что привожу те результаты, которые у меня сейчас получились на несколько более мощной машине (другой пока под рукой нет):

Код: 75.017 75.063 74.440 74.897 75.090

128.816,805 127.894,718 128.758,382 127.509,742 127.350,290
Автор: Alexyz21
Дата сообщения: 28.05.2016 21:50
Angel_Ka
Как пользоваться текстом из сообщений на форуме: выделяем мышкой текст из сообщения "FRS_RECUR", открываем в редакторе фара макрос Shmuel MFL, F7, вставляем "FRS_RECUR", Enter, находим, заменяем на 7, сохраняем, перезапускаем фар и сравниваем в равных условиях. Либо находим F.FRS_RETUPDIR+F.FRS_RECUR+F.FRS_SCANSYMLINK в EFDFN и заменяем на F.FRS_RECUR, сохраняем, перезапускаем и сравниваем в одинаковых условиях. Тогда можно говорить о соотношении времени выполнения. Но если стояла задача просто сравнить в попугаях, тогда можно делать так, как делали вы. Но если хотим получить осмысленный результат, то нужно ещё и выводить одинаковые файл-списки, а также использовать одинаковую функцию замера времени в обоих скриптах, либо Far.UpTime, либо far.FarClock().
Автор: Angel_Ka
Дата сообщения: 28.05.2016 21:58
Alexyz21
Тот мизер попугаев, который приведён выше постом, меня и команду, более чем более чем более устраивает! Другим способом обращения с базой на 3,5 лимона файлов в целом ваще не знаю такой возможности. Бранчи с этой базы не формирует ни одна временная панель, ни нативная, ни плагиновая — не хватает памяти. А Вашим макросом — запросто и сверх быстро. Так, что 130 попугаев и скопом в микроскоп не видны.

Беспредельно Вам благодарен за создание такого макроса!
Автор: Alexyz21
Дата сообщения: 28.05.2016 22:03

Цитата:
Тот мизер попугаев, который приведён выше постом, меня и команду, более чем более чем более устраивает!

Как правильно заметил Shmuel, в данном случае это заслуга FarRecursiveSearch. Меня же поразила приведённая вами невозможная разница во времени работы скриптов - перемерял и получил совершенно другие результаты.
Автор: Angel_Ka
Дата сообщения: 28.05.2016 22:10
Alexyz21

Цитата:
Но если хотим получить осмысленный результат, то нужно ещё и выводить одинаковые файл-списки, а также использовать одинаковую функцию замера времени в обоих скриптах, либо Far.UpTime(), либо far.FarClock().

С этими аргументами вполне согласен. Но это если только нужно для подтверждения теории. Но Вы теорию настолько практически обогнали, что повышение степени сравнимости результатов замеров ни чего уже ни добавит, ни убавит. Великолепный результат уже есть.

Добавлено:
Alexyz21

Цитата:
Меня же поразила приведённая вами невозможная разница во времени работы скриптов - перемерял и получил совершенно другие результаты.

Другая машина была — менее мощная, другие условия были — запущенные на ней другие процессы глушить было нельзя. А последний раунд замеров был практически в идеальных условиях. Просто мы по-разному к ним относимся. Мне не то, что 130 попугаев, а и 1300 были бы не заметны. Ещё и ещё раз благодарю Вас за великолепный макрос! Наслаждайтесь, пожалуйста, завершением очередного полезного дела.
Автор: Alexyz21
Дата сообщения: 28.05.2016 22:45
Angel_Ka
Если нравится сравнивать палец с толстым пальцем или апельсин с паровозом - сравнивайте. Но согласитесь, сравнивать эффективность надо бы в одинаковых условиях, иначе смысл в таком сравнении? - Ведь изначально понятно, что они разные!

Страницы: 123456789101112

Предыдущая тема: кл


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.