Pregunta

Me llevar a cabo una búsqueda de archivos y no hay lista de excepciones para los directorios, el problema está por debajo de código de forma recursiva itera a través de todos los archivos en los discos duros. Funciona pero es lento. Por lo tanto, necesito ayuda de optimizar su rendimiento. Gracias de antemano.

CFileFind finder;

    // build a string with wildcards
    CString strWildcard(directory);
    strWildcard += _T("\\*.*");

    // start working for files
    BOOL bWorking = finder.FindFile(strWildcard);

    while (bWorking)
    {
        bWorking = finder.FindNextFile();

        if (finder.IsDots())
            continue;

        // if it's a directory, recursively search it

        if (finder.IsDirectory())
        {
            CString str = finder.GetFilePath();
            if(NULL == m_searchExceptions.Find(str)){
                _recursiveSearch(str);
            }
            else{
                continue;
            }
        }
        //basic comparison, can be replaced by strategy pattern if complicated comparsion required (e.g. REGEX)
        if(0 == finder.GetFileName().CompareNoCase(m_searchPattern)){
            if(m_currentSearchResults.Find(finder.GetFilePath()) == NULL){
                m_currentSearchResults.AddHead(finder.GetFilePath());       
            }
        }
    }
¿Fue útil?

Solución

No creo que va a ser capaz de optimizar el rendimiento aquí. Vas a pasar 80 +% de su tiempo dentro de FindFirstFile y FindNextFile aquí (ventanas llamadas API) no importa lo que haces en términos de optimización en su final.

me hizo una pregunta similar ya y tienen aún conseguir una respuesta.

Otros consejos

Parece que tu m_currentSearchResults es una lista, y cada vez que encontrar un nombre de archivo se mira hacia arriba, si ya está en la lista. En el caso de que usted tiene un montón de archivos encontrados (cientos Say), esto puede convertirse en un cuello de botella, ya que tiene la complejidad O(N^2). Si este es el caso, considere el uso de un CMap lugar, ya que le da O(log N) búsqueda (un conjunto sería aún más apropiado que un mapa, pero usted no tiene esto en MFC pero también se podría utilizar std::set de la biblioteca estándar en su lugar).

¿Cómo lento? ¿Se perfila? Si usted está buscando recursivamente archivos en su disco duro que es muy probable que estés de E / S de la envolvente y no hay nada que puede hacer corto de conseguir un hardware más rápido de almacenamiento (como estado sólido).

Usted está haciendo una búsqueda general de un archivo. Hay un millón de productos que hay que hacer esto bien, y todos ellos utilizan la indexación como una optimización. El punto débil aquí es sin duda su disco, no el código. Comparando 1.000.000 cuerdas tomará muy poco tiempo en comparación con el tiempo que se tarda para enumerar 1.000.000 archivos en el disco.

Hay dos cuestiones fundamentales sobre el rendimiento aquí: acceso al disco duro y el recorrido de directorio. Tanto usted puede será capaz de optimizar sucesivamente.

disco duro Optimización

Un disco duro en reposo tiende a permanecer en reposo. Un cilindro de giro le gusta mantener la hilatura. Por lo tanto, dijo, los cuellos de botella en el Acceso de disco duro están comenzando arriba, buscan tiempo y el tiempo de lectura. La reducción de la cantidad de accesos y el aumento de la cantidad de datos por lectura aumentará su rendimiento.

Acceso a la memoria es más rápido que el acceso al disco duro. Así transportar grandes cantidades de datos en la memoria, y luego buscar la memoria.

Optimización del Directorio de la búsqueda.

Imagínese, si lo haría, un árbol de "páginas". Cada nodo del árbol es un directorio de cero o más directorios o archivos. Desafortunadamente, en la mayoría de sistema operativo, esta estructura de datos no está optimizado para una búsqueda eficiente.

La situación ideal es que transportar en todos los directorios relevantes en la memoria luego buscar (en la memoria). Una vez que se conoce la ubicación del archivo, el acceso aleatorio al archivo es relativamente rápido. El problema es reducir el tiempo de búsqueda sólo lectura de los directorios pertinentes; la reducción es decir, el número de directorio irrelevante lee.

La mayoría de las aplicaciones que realizan la búsqueda de archivos en un disco duro leer la unidad y crear su propia estructura de datos optimizada (s). Esto puede no ser óptima para grandes unidades de disco duro con cantidades enormouse de archivos o los casos de algunas búsquedas de archivos.

Si puedes, decirle al sistema operativo de mantener la mayor cantidad de directorios en la memoria como sea posible.

Mejora del rendimiento: La reducción de otras aplicaciones

.

Para algunas aplicaciones, el tiempo de rendimiento percibido depende de otras aplicaciones que se ejecutan al mismo tiempo. Ejecución de un compilador y una búsqueda en Internet al mismo tiempo que se ralentizará la mayoría de las otras aplicaciones. Así que trate de eliminar otras aplicaciones que no sean necesarias se ejecuten simultáneamente con la suya. Además, la inversión rasing la prioridad de su aplicación.

1 para el perfil que primero para estar seguro. Además, éste parece ser un problema que también podría ser resuelto mediante el tarea paralela Biblioteca - lanzar una tarea como se ve cada directorio, y utilizar todos los núcleos de la CPU -

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top