Russian Qt Forum
Ноябрь 06, 2024, 02:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 ... 3 4 [5]   Вниз
  Печать  
Автор Тема: Остановка рекурсии поиска файлов [РЕШЕНО]  (Прочитано 26314 раз)
V1KT0P
Гость
« Ответ #60 : Март 14, 2012, 20:46 »

тут есть одна маленькая вещь, которая важна - фильтр
Так реализуй такой фильтр как тебе нужен, либо выдери кусок из исходников QDir. Там вроде используется QRegExp.
Записан
V1KT0P
Гость
« Ответ #61 : Март 14, 2012, 23:39 »

Добавил такую же RegExp проверку как и внутри QDir. Результат как и ожидалось при одном цикле быстрее.
Я думаю уже стоит отметить тему как решенную =).
Записан
daimon
Гость
« Ответ #62 : Март 15, 2012, 00:09 »

Добавил такую же RegExp проверку как и внутри QDir. Результат как и ожидалось при одном цикле быстрее.
Я думаю уже стоит отметить тему как решенную =).
подробнее пожалуйста куда регулярные выражения вставлять?

попробуй поменять местами поиск, сначала с одним циклом, потом с двумя))) посмотри у себя, бывают чудеса

я заметил, что тот алгоритм, который первым ищет - теряет во времени!!!!

нужно независимо их запускать, я в плане не по очереди, а один алгоритм в приложении и так смотреть
« Последнее редактирование: Март 15, 2012, 00:14 от daimon » Записан
V1KT0P
Гость
« Ответ #63 : Март 15, 2012, 00:17 »

подробнее пожалуйста куда регулярные выражения вставлять?

попробуй поменять местами поиск, сначала с одним циклом, потом с двумя))) посмотри у себя, бывают чудеса

я заметил, что тот алгоритм, который первым ищет - теряет во времени!!!!

нужно не зависимо их запускать, я в плане не по очереди, а один алгоритм в приложении и так смотреть
Менял я поиск местами, как видишь дошел до отдельных кнопок. После нескольких нажатий уже вроде как мож что кешируется или типа того. Но все-равно с одним циклом побыстрее =). Хотя да иногда бывают странности ибо это ФС это такая штука... Вот если подключить RAM диск и на нем проводить замеры, тогда да будет точные данные.

Насчет регулярок я сделал вот так(мог что-то и не так сделать, у меня по вечерам уже голова не так хорошо работает):
Код
C++ (Qt)
void FindFiles::find2(QString pathr, QStringList filters)
{
   qint64 start;
   qint64 stop;
   start = QDateTime::currentMSecsSinceEpoch();
   QVector<QRegExp> regFilters;
   regFilters.reserve(filters.size());
   if (!filters.isEmpty() && !filters.contains("*")) {
       for (qint32 i=0; i<filters.count(); i++) {
           QRegExp regFilter(filters.at(i), Qt::CaseInsensitive, QRegExp::Wildcard);
           regFilter.setMinimal(true);
           regFilters.append(regFilter);
       }
   }
 
   QStack<QString> dirs;
   QString path;
   QStringList *listFiles = new QStringList;
   if(pathr.isEmpty())
       path = QDir::currentPath();
   else
       path = pathr;
   dirs.push(path);
   while (!dirs.isEmpty()) {
       path = dirs.pop();
       QDir dir(path);
 
       if(!dir.exists())
           continue;
 
       foreach (QFileInfo file, dir.entryInfoList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot)) {
           if(file.isDir()) {
               dirs.push(file.absoluteFilePath());
           } else {
               if (regFilters.isEmpty()) {
                   *listFiles << file.absoluteFilePath();
               } else {
                   for (qint32 i=0; i<regFilters.count(); i++) {
                       if (regFilters.at(i).exactMatch(file.fileName())) {
                           *listFiles << file.absoluteFilePath();
                           break;
                       }
                   }
               }
           }
       }
   }
   stop = QDateTime::currentMSecsSinceEpoch();
   emit finded2(listFiles, stop-start);
}
Записан
daimon
Гость
« Ответ #64 : Март 15, 2012, 00:33 »

вот просто по очереди перекомпилил, менял очередность вызова алгоритмов и вот, что у меня

и получается при любом варианте, выигрывают 2 цикла (может комп у меня особенный)

хоть, когда первым стартует, хоть вторым, соответственно выигрывает одному циклу при разной очередности его вызова
« Последнее редактирование: Март 15, 2012, 00:44 от daimon » Записан
daimon
Гость
« Ответ #65 : Март 15, 2012, 00:40 »

подробнее пожалуйста куда регулярные выражения вставлять?

попробуй поменять местами поиск, сначала с одним циклом, потом с двумя))) посмотри у себя, бывают чудеса

я заметил, что тот алгоритм, который первым ищет - теряет во времени!!!!

нужно не зависимо их запускать, я в плане не по очереди, а один алгоритм в приложении и так смотреть
Менял я поиск местами, как видишь дошел до отдельных кнопок. После нескольких нажатий уже вроде как мож что кешируется или типа того. Но все-равно с одним циклом побыстрее =). Хотя да иногда бывают странности ибо это ФС это такая штука... Вот если подключить RAM диск и на нем проводить замеры, тогда да будет точные данные.

Насчет регулярок я сделал вот так(мог что-то и не так сделать, у меня по вечерам уже голова не так хорошо работает):
Код
C++ (Qt)
void FindFiles::find2(QString pathr, QStringList filters)
{
   qint64 start;
   qint64 stop;
   start = QDateTime::currentMSecsSinceEpoch();
   QVector<QRegExp> regFilters;
   regFilters.reserve(filters.size());
   if (!filters.isEmpty() && !filters.contains("*")) {
       for (qint32 i=0; i<filters.count(); i++) {
           QRegExp regFilter(filters.at(i), Qt::CaseInsensitive, QRegExp::Wildcard);
           regFilter.setMinimal(true);
           regFilters.append(regFilter);
       }
   }
 
   QStack<QString> dirs;
   QString path;
   QStringList *listFiles = new QStringList;
   if(pathr.isEmpty())
       path = QDir::currentPath();
   else
       path = pathr;
   dirs.push(path);
   while (!dirs.isEmpty()) {
       path = dirs.pop();
       QDir dir(path);
 
       if(!dir.exists())
           continue;
 
       foreach (QFileInfo file, dir.entryInfoList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot)) {
           if(file.isDir()) {
               dirs.push(file.absoluteFilePath());
           } else {
               if (regFilters.isEmpty()) {
                   *listFiles << file.absoluteFilePath();
               } else {
                   for (qint32 i=0; i<regFilters.count(); i++) {
                       if (regFilters.at(i).exactMatch(file.fileName())) {
                           *listFiles << file.absoluteFilePath();
                           break;
                       }
                   }
               }
           }
       }
   }
   stop = QDateTime::currentMSecsSinceEpoch();
   emit finded2(listFiles, stop-start);
}
сильно написано, просто думаю как раз из-за регулярных выражений и тормоза при одном цикле, чего бы так не делать?

Код
C++ (Qt)
foreach (QString file, dir.entryList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot))
{
if(m_stop) return listFiles;
QFileInfo temp(dir,file);
 
if(temp.isDir())
dirs.push(path + QDir::separator() + file);
 
else if(m_FilterNames.contains("*." + temp.suffix(), Qt::CaseInsensitive))
{
listFiles << QFileInfo(dir, file).absoluteFilePath();
m_countFiles++;
emit currentCountFiles(m_countFiles);
}
}
Записан
V1KT0P
Гость
« Ответ #66 : Март 15, 2012, 00:43 »

сильно написано, просто думаю как раз из-за регулярных выражений и тормоза при одном цикле, чего бы так не делать?
А ты посмотри исходники QDir, если конкретнее то QDirIterator. Там именно так и сделано. Но ничего не мешает тебе сделать по своему. Если надо фильтровать по расширению то вообще проще юзать QStrings.endsWith(".h");.
« Последнее редактирование: Март 15, 2012, 00:45 от V1KT0P » Записан
daimon
Гость
« Ответ #67 : Март 15, 2012, 00:47 »

сильно написано, просто думаю как раз из-за регулярных выражений и тормоза при одном цикле, чего бы так не делать?
А ты посмотри исходники QDir, если конкретнее то QDirIterator. Там именно так и сделано. Но ничего не мешает тебе сделать по своему. Если надо фильтровать по расширению то вообще проще юзать QStrings.endsWith(".h");.

ничего против не имею))) накрутка циклов при регулярных выражениях возрастает в разы, следовательно нечитабельно

а сейчас потестю у себя регулярные выражения

интересные данные, теперь, если вторым номером идёт один цикл, то он работает быстрее второго номера 2 циклов, ну и соответственно также, если первым номером))

но всё равно пока тот, кто стартует проигрывает второму номеру
« Последнее редактирование: Март 15, 2012, 00:58 от daimon » Записан
V1KT0P
Гость
« Ответ #68 : Март 15, 2012, 01:20 »

ничего против не имею))) накрутка циклов при регулярных выражениях возрастает в разы, следовательно нечитабельно
Щас провел замеры. Регулярка получается в 2 раза медленнее того что ты предлагаешь. Но в то-же время регулярка более гибкая. Если регулярка занимала 27% всего времени, то твой поиск 13%.
Записан
daimon
Гость
« Ответ #69 : Март 15, 2012, 01:26 »

ничего против не имею))) накрутка циклов при регулярных выражениях возрастает в разы, следовательно нечитабельно
Щас провел замеры. Регулярка получается в 2 раза медленнее того что ты предлагаешь. Но в то-же время регулярка более гибкая. Если регулярка занимала 27% всего времени, то твой поиск 13%.

ну то понятно))) и тут сразу приходит на ум, что работает регулярка почти как 2 цикла (ведь там тоже есть фильтр)
« Последнее редактирование: Март 15, 2012, 01:47 от daimon » Записан
Страниц: 1 ... 3 4 [5]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.2 секунд. Запросов: 20.