Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Asm вставки, Увеличение производительности 
:(
    Опции темы
valex13
Дата 22.3.2005, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 29.1.2003
Где: Иркук. область, г . Иркутск

Репутация: нет
Всего: 1



Господа!
Имеется следующий код на С++ Builder 5. Осуществляет поиск в TList элемента.
Код


struct Contract
{
int ClientID; //Код клиента 
int iContrTypeID; //Код типа контракта
AnsiString strDogNumber; //Номер договора
AnsiString strDateDogOpen; //Дата заключения договора
};
..
TList* ContractList;
...

ontract* UnContracts::FindContract (int ClientID)
{

bool bFind= false;
for (int i=0;i<=ContractList->Count-1;i++)
{
Contract *m_Dog = (Contract*)ContractList->Items[i];
if (m_Dog->ClientID ==ClientID)
{
//Запись найдена!
bFind = true;
//Удаляю ссылку, чтобы не наткнуться повторно
ContractList->Delete (i);
return (m_Dog);
}
}
if (!bFind)
return (NULL);
}



Я выяснил, что имеенно эта часть кода работает дольше всега, т.к. количество записей велико.
Я бы хотел заменить поиск реквизита asm вставкой
Как мне на asm написать следующую строку ?
Код

Contract *m_Dog = (Contract*)ContractList->Items[i];

PM MAIL ICQ   Вверх
Chingachguk
Дата 22.3.2005, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: 3
Всего: 18



Что такое TList ???

А вообще примерно так:

mov edx,ContractList
mov eax,i
mov eax,[edx+eax*4].Items
mov m_Dog,eax


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
valex13
Дата 23.3.2005, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 29.1.2003
Где: Иркук. область, г . Иркутск

Репутация: нет
Всего: 1



Код

  Contract *m_Dog =new Contract;

               m_Dog->ClientID = qContracts->FieldByName ("f_CLT_Auto")->AsInteger;
               m_Dog->strDogNumber = qContracts->FieldByName ( "f_ContrNum")->AsString;
               m_Dog->strDateDogOpen = ConvertBTrieveDate ( qContracts->FieldByName ("f_DateCtr")->AsInteger );
               m_Dog->iContrTypeID = qContracts->FieldByName ("f_CTP_Auto")->AsInteger;


          ContractList->Add( m_Dog);


Это класс TList. Наследник класса TObject

Добавлено @ 12:13
По сути этот класс работает со связанным списком указателей на что либо. В данном случае я создаю структуру. Освобощдаю под нее память и заношу туда данные. Затем в список добавляю ссылку на эту ячейку памяти.
PM MAIL ICQ   Вверх
valex13
Дата 23.3.2005, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 29.1.2003
Где: Иркук. область, г . Иркутск

Репутация: нет
Всего: 1



Код

           mov edx,ContractList

Вот на эту строчку и ругается. ContractList не просто переменная - это ссылка на класс. Может это имеет значение?
PM MAIL ICQ   Вверх
Chingachguk
Дата 23.3.2005, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: 3
Всего: 18



Попробуй mov edx,dword ptr ContractList.

А вообще сначала попробуй оптимизировать поиск на более высоком уровне прежде чем переписывать объектный код с си на асм. Например, двоичный поиск по отсортированному списку. У вас вообще в си++ есть всякие там специальные классы для работы с быстрым поиском.

И еще вот что: просто зайди в отладчике в свой сишный код и увидишь, что нагенерил тебе компиллятор (в виде асма тока надо смотреть) или же включи опцию "генерить асм-листинг" и скомпиллируй с ней. Это будет неоптимизированный код. Возьми его за основу (синтаксис). Из него сразу будут ясно, как работать с ContractList.


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
au100
Дата 11.6.2005, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 11.6.2005

Репутация: нет
Всего: нет



Такой поиск в неотсортированном списке всегда занимает огромное время. Для ускорения процесса создай либо отсортированный массив и ищи в нем, либо сбалансированное дерево и проходи по нему поиском. Иначе бесполезно применять ассемблер в таких случаях. Причина в алгоритме, в не в С++

Это сообщение отредактировал(а) au100 - 11.6.2005, 18:04
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для Windows/DOS"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для Windows/Dos | Следующая тема »


 




[ Время генерации скрипта: 0.0514 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.