Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Visual C++

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13

Открыть новую тему     Написать ответ в эту тему

gorthaur

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Да

Всего записей: 23 | Зарегистр. 05-01-2007 | Отправлено: 19:26 08-05-2007
Qraizer



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
А релиз тормозит также, как дебуг? А о знаем мы, как выглядит STL без оптимизации... Кто такой этот string? И кстати, что там делает throw(0)??

----------
Одни с годами умнеют, другие становятся старше.

Всего записей: 613 | Зарегистр. 08-08-2006 | Отправлено: 20:56 08-05-2007
gorthaur

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Релиз так же. string - STL'евски стринг. Пробовал без него, та же фигня. throw(0) там находится;) Можно убрать
 
Добавлено:
Как я понимаю, тормоза идут в момент обращения к членам IXMLDOMNodePtr. Или во время преобразования _bstr_t -> char*. Но вот как с этим всем удовольствием бороться...
Некоторое время назад прога вообще начала вылетать с Microsoft C++ exception: _com_error at memory location 0x0440f978.. где-то на 3000 записей Я вообще фигею. Или я идиот, или одно из двух

Всего записей: 23 | Зарегистр. 05-01-2007 | Отправлено: 21:01 08-05-2007
Qraizer



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Вот поэтому я и предпочитаю (и всем советую) никогда не использовать using namespace std, а явно писать std:: везде, где это надо. Сразу видно - где стандартное, а где нет.
Тогда рабочая гипотеза: если закоментарить ифы, то функция становится маленькой и простой, поэтому компилятор её инлайнит. Следовательно отсутствуют вызовы ParseElem() и, как следствие, передача параметров по значению - кто такой MSXML2::IXMLDOMNodePtr не знаю, возможно что и класс конструктором копии - а также разворачивается цикл. А маленькой она становится потому, что иначе она большая - ведь в каждом ифе string сравнивается с char*, длину которого ещё надо подсчитать. Замени их на static const string-и. Да и не факт, что ты извлекаешь все преимущества работы со string-ом в плане эффективного использования его потенциала производительности - не видно, что там за русскими комментами скрывается.

----------
Одни с годами умнеют, другие становятся старше.

Всего записей: 613 | Зарегистр. 08-08-2006 | Отправлено: 21:17 08-05-2007
vshersh



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gorthaur
Попробуй наоборот: преобразовывать char* в _bstr_t.  
Без учета того, что происходит в ИФАХ - получается намного быстрее

Код:
 
..
if (_bstr_t("tag1") == _bstr_t(nptr->nodeName, false)){
//обрабатываем tag1
};
...
 

Естественно _bstr_t("tag1") и т.п. лучше вынести за пределы функции... и т.п.

Всего записей: 506 | Зарегистр. 12-01-2006 | Отправлено: 23:46 08-05-2007
gorthaur

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Попробуй наоборот: преобразовывать char* в _bstr_t.  
Без учета того, что происходит в ИФАХ - получается намного быстрее

Пробовал.
Чего я уже только не пробовал Мистика, блин
 
Добавлено:
В ИФАХ не происходит ничего особенного. Данные nptr->text пишутся в строку str  в определённом формате.

Всего записей: 23 | Зарегистр. 05-01-2007 | Отправлено: 00:02 09-05-2007
vshersh



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gorthaur
Может тогда стоит попробовать выбирать данные при помощи XPath?

Всего записей: 506 | Зарегистр. 12-01-2006 | Отправлено: 00:34 09-05-2007
gorthaur

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Жалко всё переделывать. Прога работает, работает правильно. На небольших файлах. Да и просто уже спортивный интерес, где этот долбаный косяк

Всего записей: 23 | Зарегистр. 05-01-2007 | Отправлено: 22:58 09-05-2007
vshersh



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я провел некоторые эксперименты - и они показали, что с ростом размера исходного файла XML время обработки (в частности конвертации _bstr_t в std::string) растет нелинейно. Т.е. при простом цикле вида

Код:
 
0    //using XPath
1    MSXML2::IXMLDOMNodeListPtr nlistptr = Document->selectNodes(_bstr_t(L"/root/element/*"));
2    long l = (nlistptr->length > 2000 ? 2000 : nlistptr->length);
3    for (int i = 0; i < nlistptr->length; i++) {  
4        node = nlistptr->item[i];
5
6        string name((char*)node->nodeName);
7        string value((char*)node->text);
8 //...
10    }  
 

для файла размером в 500 КБ (с 2000 требуемых элементов) обработка происходит меньше секунды, независимо от того закомментированы ли строки 6 и 7 или нет.
Если же взять файл размером в 15-20 МБ то обработка в приведенном виде (первых 2000 элементов) занимает порядка десятка (или нескольких десятков) секунд, но!, если закомментировать строки 6 и 7 то "простой обход" занимает снова меньше секунды...
Есть подозрение, что при таком преобразовании string name((char*)node->nodeName); происходит leak... Но объяснить почему -  не возьмусь

Всего записей: 506 | Зарегистр. 12-01-2006 | Отправлено: 23:26 09-05-2007
gorthaur

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Жаль. Но всё равно спасибо за помощь. А нет мыслей, как это можно исправить с минимальными потерями (т.е. не переделывать всё заново через SAX или ещё как-нибудь)?
 
Добавлено:
Скорее всего, дело в скорости обращения к членам IXMLDOMNodePtr , т.е. в моменте node->nodeName. Преобразование _bstr_t -> char*, по идее, от размера файла зависеть не должно. Но тогда совсем грустно, т.к. исправить, скорее всего, нереально. За то время, что я потратил на поиск и попытки исправления этой утечки, можно было написать собственный простенький парсер и не таскать msxml

Всего записей: 23 | Зарегистр. 05-01-2007 | Отправлено: 01:20 10-05-2007 | Исправлено: gorthaur, 01:38 10-05-2007
last_wish

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vshersh
ИМХО ты создаешь внутри цикла два достаточно больших объекта типа string - за КАЖДЫЙ проход цикла
попробуй вынести объявление string name и value за цикл, а внутри делай простое присвоение

Всего записей: 109 | Зарегистр. 26-10-2006 | Отправлено: 02:13 10-05-2007
vshersh



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
gorthaur

Цитата:
Скорее всего, дело в скорости обращения к членам IXMLDOMNodePtr , т.е. в моменте node->nodeName

По-моему как-раз наоборот! Проблема в конвертации!
 
last_wish
Я думаю любой оптимизатор вынесет объявление за пределы цикла...
 

Всего записей: 506 | Зарегистр. 12-01-2006 | Отправлено: 10:17 10-05-2007
last_wish

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vshersh
Моё дело предложить
Специально проверил для Mingw (все уровни оптимизации), и для release в ms vc++ 6.0, оптимизации нет

Всего записей: 109 | Зарегистр. 26-10-2006 | Отправлено: 13:22 10-05-2007
vshersh



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
last_wish
Просто я тоже проверил - конвертится все-равно медленно (при выше описанных условиях). Насчет оптимизатора - лишь мое предположение.
Или у тебя при этом финте обработка происходит быстрее?

Всего записей: 506 | Зарегистр. 12-01-2006 | Отправлено: 13:47 10-05-2007
Qraizer



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
vshersh
С какой стати он будет их выносить? Они ж конструируются внутри цикла значениями, которые определяются тоже внутри цикла. Плюс ещё область видимости...
last_wish
Для vc++ 6.0 не советую использовать родную STL. Во-первых, она образца 1995-го года - стандарт же ратифицирован в 1998-м. Во-вторых, она местами жутко не оптимальна, в вопросах перераспределения памяти под стораджи контейнеров в частности. Для него лучше юзать какой-нибудь STLPort.

----------
Одни с годами умнеют, другие становятся старше.

Всего записей: 613 | Зарегистр. 08-08-2006 | Отправлено: 14:07 10-05-2007
last_wish

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vshersh
Тестил так:
Код:
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
 
int main()
{
    string str;
    int strt=GetTickCount();
    for (int i=0; i<100;i++)
     for(int j=0; j<100;j++)
       for(int k=0; k<1000;k++)
         string str="HI";
         //str="HI"; <-поменял на это
    cout << GetTickCount()-strt << endl;
    cin.get();    
}
0,7 сек против 3,5 (в среднем)
 
Добавлено:
Qraizer
спасибо, буду знать

Всего записей: 109 | Зарегистр. 26-10-2006 | Отправлено: 14:09 10-05-2007
vshersh



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Qraizer

Цитата:
Плюс ещё область видимости...

согласен - глупость сказал...
 
last_wish
Все-таки в твоем цикле string конструируется 100 * 100 * 1000  = 10 лимонов раз, а в условиях исходной задачи ~ до 100 тыс. раз, как я понял а это очень большая разница.

Всего записей: 506 | Зарегистр. 12-01-2006 | Отправлено: 15:17 10-05-2007
gorthaur

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Только что ради интереса проделал тест. В цикле миллион раз преобразовал строку из _bstr_t в std::string. Летает. Меньше секунды.

Всего записей: 23 | Зарегистр. 05-01-2007 | Отправлено: 16:24 10-05-2007
Qraizer



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Опять-таки простые случаи компилятор может лучше оптимизировать, размернуть цикл например, проинлайнить вызовы, а то и вообще отдецимировать тело цикла, где по его мнению нету полезного действия. Сравнивать лучше на рабочем коде, а не на отдельных простых примерах.

----------
Одни с годами умнеют, другие становятся старше.

Всего записей: 613 | Зарегистр. 08-08-2006 | Отправлено: 15:27 11-05-2007
gorthaur

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Проблема оказалась всё-таки в nptr->text. Плюнул на него, достаю текст из XML, юзая nptr->xml. Замечательно работает. В чём была проблема не представляю

Всего записей: 23 | Зарегистр. 05-01-2007 | Отправлено: 15:39 11-05-2007
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Visual C++


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru