Странное поведение с использованием оператора if - PullRequest
0 голосов
/ 21 марта 2012

Я разрабатываю приложение, используя OpenSceneGraph, и я сталкиваюсь со странным поведением в операторе if. Я не уверен, специфичен ли он для API, потому что он просто не имеет никакого смысла для меня.

код:

if ( !fileAddList_.empty() )
{
    sg::FileStampThread::instance()->addFiles( fileAddList_ );
    fileAddList_.clear();
}

Где:

  • fileAddList_: статический вектор пользовательских объектов, используемых для поддержки Имена файлов

  • FileStampThread: экземпляр объекта OpenThreads

  • addFiles (): метод в потоке, который сохраняет список файлов объекты переданы ему

Приведенный выше код выполняет горячую загрузку в моем приложении. Экземпляр FileStampThread выполняется непрерывно, проверяя отметки времени переданных ему имен файлов. После изменения штампа имя файла сохраняется в другом списке и возвращается для повторной загрузки.

Что странно, так это то, что обход обновления графа сцены (когда исполняется этот код) значительно замедляется, когда я включаю этот раздел кода, даже если нет файлов для добавления (в том числе, даже если fileAddList_ пуст) , В результате время прохождения обновления увеличивается на порядок.

Однако, если я закомментирую вызов sg :: FileStampThread :: addFiles, замедление исчезнет. Тем не менее, я перехватил вызов в режиме отладки, и он никогда не выполняется.

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

В качестве примечания, я подозреваю, что это может иметь какое-то отношение к объявлению переменной как статической, поэтому я попытался объявить ее как глобальную (используя extern), но с тем же эффектом.


Правка для некоторых комментариев ниже:

  • Поток является экземпляром объекта OpenThreads. Нет специфичных для MS вещи, здесь. Экземпляр статический.

  • addFiles () не является шаблоном

  • Я проверил цикл с кодом в нем. Я закомментировал строки поочередно. Я абсолютно уверен, что включение addFiles () зов виновник.

  • Отладка и выпуск ничем не отличаются, отодвигая код в отдельная функция ничего не изменила, к сожалению.

  • OSG высокопроизводительный, и комментарий о неправильном прогнозе может быть Право на. Исследования ожидаются ...

Код для класса FileStampThread:

void sg::FileStampThread::addFiles( sg::AssetFileList& files )
{
    OpenThreads::ScopedLock<OpenThreads::Mutex> lock( contentMutex_ );

    for ( sg::AssetFileList::iterator it = files.begin(); it != files.end(); ++it )
    {
        if ( boost::filesystem::exists( (*it).getPath() ))
            fileList_.push_back( (*it) );
    }
};

1 Ответ

1 голос
/ 21 марта 2012

попробуйте переместить код:

sg::FileStampThread::instance()->addFiles( fileAddList_ );
fileAddList_.clear();

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

...