Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оптимизация функции, Оптимизировать по скорости 
:(
    Опции темы
vladko
Дата 14.4.2009, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Эта функция оформленная в виде длл считывает текстовый файл производит вычисления и выодит новый текстовый файл. Можно ли этот код оптимизировать по скорости? Например 150 мб считает минуту. Сократить бы это время в 2-3 раза...

Код

#include <stdio.h>
#include <map>
using namespace std;

typedef map<double, int> Map;

extern "C"
{

typedef int* MyInt;
typedef map<double,MyInt> Map2;

void _stdcall proc1(const char* fileName, long Date_start, long Time_start, long Date_end, long Time_end)
{
FILE* f = fopen(fileName, "r");
if(!f)
{
printf("file not found\n");
return;
}
Map2 m;

for(;;)
{
double c=0;
long a=0, b=0;
int d=0;
if(fscanf(f, "%ld %ld;%lf;%d",&a,&b,&c,&d)< 4)
break;
if(a>Date_end) break;
if(a<Date_start) continue;
if((a==Date_start)&&(b<Time_start)) continue;
if((a==Date_end)&&(b>Time_end)) break;

int *inf=(int*)malloc(2);// {0,0};
inf[0]=d;
inf[1]=1;

pair<Map2::iterator, bool> result =
m.insert(pair<double,MyInt>(c,inf));
if(!result.second)
{
(result.first)->second[0] += d;
(result.first)->second[1] += 1;
};
}
fclose(f);

char outFileName[264];
strcpy(outFileName, fileName);
strcat(outFileName, ".out");
f = fopen(outFileName, "w");
int i=1;
for(Map2::iterator it = m.begin(); it != m.end(); ++it)
{
fprintf(f,"%f %d %d\n", it->first, it->second[0], it->second[1]);
i++;
}
fclose(f);
}




PM MAIL   Вверх
azesmcar
Дата 14.4.2009, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



vladko

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

Добавлено через 3 минуты и 26 секунд
vladko
и этот код работает?

Код

int *inf=(int*)malloc(2);// {0,0};

где free??? 
Код

inf[0]=d;
inf[1]=1;


ты освободил два байта, обращаешся к большему количеству...или я чего-то не пойму?
PM   Вверх
GoldFinch
Дата 14.4.2009, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

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



жесть какая-то
этот код не оптимизировать нада, а удалить и написать новый
PM MAIL ICQ   Вверх
vladko
Дата 14.4.2009, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Блин, че так все плохо? На мелких файлах нормально работает... Код не я писал...
PM MAIL   Вверх
xvr
Дата 14.4.2009, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Вот это
Код

int *inf=(int*)malloc(2);// {0,0};
inf[0]=d;
inf[1]=1;
убрать и заменить на массив из 2х int непосредственно в map (malloc'и в цикле жрут много времени (и памяти  smile ))

Код

struct MyInt {
 int data[2];

 MyInt() {data[0]=data[1]=0;}
 
 void add(int d) {data[0]+=d; ++data[1];}
};

typedef map<double,MyInt> Map2;

...

/*
int *inf=(int*)malloc(2);// {0,0};
inf[0]=d;
inf[1]=1;
pair<Map2::iterator, bool> result =
m.insert(pair<double,MyInt>(c,inf));
if(!result.second)
{
(result.first)->second[0] += d;
(result.first)->second[1] += 1;
};
*/

m[c].add(d);


PM MAIL   Вверх
zim22
Дата 14.4.2009, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



товарищ vladko уже эту тему подымал.
http://forum.vingrad.ru/forum/topic-253997...y1831844/0.html

vladko, не лучше ли вам пойти в Центр Помощи?


--------------------
PM MAIL   Вверх
vladko
Дата 14.4.2009, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ага, только там не помогли... вот я и выложил результат помощи с другого форума...
PM MAIL   Вверх
GoldFinch
Дата 14.4.2009, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

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



Цитата(vladko @  14.4.2009,  12:46 Найти цитируемый пост)
выложил результат помощи с другого форума... 

ололо помогли так помогли)
PM MAIL ICQ   Вверх
vladko
Дата 14.4.2009, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



да, помогли, а не флудили... прога рабочая... 
спасибо за исправления xvr!!!
PM MAIL   Вверх
0xDX
Дата 14.4.2009, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Читать файл нужно побольше буфером.
Выделять память  нужно залпом, и не когда не использовать malloc(new ) в цикле.

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


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



vladko

Если она работает - то это видимо счастливая случаность smile

1. Читай из файла большими кусками - например по мегабайту за итерацию.
2. Не выделяй память в цикле и не обявляй переменных.
3. Не забывай освобождать память если она больше не нужна.

Попробуй все таки привести код в порядок..
PM   Вверх
GoldFinch
Дата 14.4.2009, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

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



azesmcar, при завершении программы память освобождается сама, так что там ничего освобождать не надо
PM MAIL ICQ   Вверх
azesmcar
Дата 14.4.2009, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

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



GoldFinch

на каждый вызов malloc и new должен быть free и delete соответственно до завершения программы. И не важно что операционная система подотрет за вами то что не сделали вы сами.
PM   Вверх
zim22
Дата 14.4.2009, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Цитата(azesmcar @  14.4.2009,  12:14 Найти цитируемый пост)
Попробуй все таки привести код в порядок..

не получится. smile
vladko писал: просто я си почти не знаю... пишу прогу на VB...




--------------------
PM MAIL   Вверх
vladko
Дата 14.4.2009, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



azesmcar, а как читать блоками если файл разбит на строки (и они разной длины)?


p.s. что зим, проще поржать, чем что-то посоветовать?

Это сообщение отредактировал(а) vladko - 14.4.2009, 12:32
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




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


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

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