Модераторы: 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   Вверх
azesmcar
Дата 14.4.2009, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



vladko
Скажи подробнее какой формат файла? Он у тебя вроде не текстовый. Что там запиасно и в какой очередности.
Если я не ошибаюсь это long, long, double, int?
сделай структуру с этими типами и читай через fread сразу в структуру, можно читать не по одному а блоками - по 20 структур к примеру, попытно пишешь в выходной файл.
PM   Вверх
GoldFinch
Дата 14.4.2009, 12:43 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(azesmcar @  14.4.2009,  13:25 Найти цитируемый пост)
на каждый вызов malloc и new должен быть free и delete соответственно до завершения программы. И не важно что операционная система подотрет за вами то что не сделали вы сами. 

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


Новичок



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

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



azesmcar, файл как раз текстовый, пример:
20090318 010017;1.4045;7
20090318 010150;1.405;1
20090318 010150;1.405;1
20090318 010151;1.405;1
20090318 010307;1.4049;1
20090318 010308;1.4044;1
20090318 010308;1.4041;1
20090318 010802;1.4049;1
20090318 011056;1.4046;1
20090318 011406;1.4047;1
20090318 011416;1.4047;1
20090318 011903;1.4049;2
20090318 011903;1.405;2
20090318 011912;1.4054;1
20090318 011912;1.4054;2
20090318 011912;1.4054;1
20090318 011926;1.4053;1
20090318 012141;1.4057;5
20090318 012159;1.4056;1

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


uploading...
****


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

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



GoldFinch
Если есть правило - оно обосновано! Очень интересует - создайте топик поговорим об этом. Тут другой вопрос обсуждается:
Кратко
для delte - чтобы вызывался деструктор
для malloc - ос не обязана за вас это делать, нет стандарта ос который ее к этому обязывает, сегодня это виндоуз - завтра не дай и бог АбабОС - гарантий нет + это может быть только один модуль программы и по завершению функции - не факт что программа заканчивается.

Добавлено через 3 минуты и 14 секунд
GoldFinch

это вам в голову не приходило или просто тупо думаете что виндоуз единственная операционная система и все программы состоят из одной единственной функции?

Добавлено через 6 минут и 5 секунд
vladko

значит файл текстовый.
Просто берем и читаем конкретный размер - к примеру 1мегабайт данных из файла в буфер выделенный malloc (выделяем один раз).
Потом читаем из файла в этот буфер один мегабайт данных, смотрим сколько на самом деле прочитали (запоминаем).
Обрабатываем данные в цикле, если нашли строку которая прочиталась наполовину, запоминаем ее начало - читаем продолжение из файла. Пока все данные не прочтем (т.е. сколько прочли - меньше чем сколько попросили прочесть)

Примерно так

Это сообщение отредактировал(а) azesmcar - 14.4.2009, 12:54
PM   Вверх
vladko
Дата 14.4.2009, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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


uploading...
****


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

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



vladko

напиши в аську минут через 10. Номер аськи в профайле
PM   Вверх
xvr
Дата 14.4.2009, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Файл лучше даже не читать (пусть одним куском), а целиком замэпить в память (см. CreateFile/CreateFileMapping/MapViewOfFile), не забудьте затерминэйтить его нулем после мэпа. Для чтения данных из файла лучше применить не sscanf(fscanf) а прямой разбор через stroul/strtod (может быть быстрее)

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



****


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

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



Цитата(azesmcar @  14.4.2009,  13:53 Найти цитируемый пост)
думаете что виндоуз единственная операционная система и все программы состоят из одной единственной функции?

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


uploading...
****


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

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



GoldFinch

затем что завтра - если программа станет делать что-то еще, разработчик забудет про malloc в функции proc1. Или это может быть другой разработчик который даже не знает что в функции proc1 есть malloc без free и разработчик надеялся на систему, в задаче нигде не указано что разработка идет под операционную систему виндоуз, это С++, и раздел называется С++ а не программирование под виндоуз, код надо писать так чтобы при портировании делалось минимум изменений (если можно вообще не делалось), т.е. писать в соответствии со стандартами. Я после института не писал ни одной программы которая бы отработала один раз и завершилась, в работе такие программы встречаются редко и освобождение памяти должно войти в привычку.
PM   Вверх
GoldFinch
Дата 14.4.2009, 14:21 (ссылка)  | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(azesmcar @  14.4.2009,  15:17 Найти цитируемый пост)
в задаче нигде не указано что разработка идет под операционную систему виндоуз

в задаче сказано что это dll, значит windows. читайте задачу внимательнее
PM MAIL ICQ   Вверх
azesmcar
Дата 14.4.2009, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



GoldFinch

хотите длл под линукс покажу smile просто расширение другое..
ладно, проехали...не хотите освобождать память - не надо.

Это сообщение отредактировал(а) azesmcar - 14.4.2009, 14:30
PM   Вверх
GoldFinch
Дата 14.4.2009, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



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


uploading...
****


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

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



GoldFinch

предыдущий пост - это в другом топике? не смотрел. Какая разница какая операционка? я вам полно других примеров привел.
Это вопрос из темы "не надо передавать std::string по константной ссылке, все равно в линуксе он 4 байта занимает".

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


любитель
****


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

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



GoldFinch, я Вас правильно понял, Вы утверждаете, что если пишите короткую прогу и знаете что под Виндоус, то предпочтительней или даже необходимо не возвращать выделенную память ?!

Это сообщение отредактировал(а) mes - 14.4.2009, 16:26


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


Опытный
**


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

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



GoldFinch,
вы строите из себя панка от программирования?
у вас, должен заметить, это получается
правда в нехорошем смысле слова "панк"  smile 


--------------------
user posted image
PM MAIL   Вверх
zim22
Дата 14.4.2009, 16:54 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(J0ker @  14.4.2009,  16:22 Найти цитируемый пост)
правда в нехорошем смысле слова "панк"

почитал словарь Collins. У панка одни положительные значения за исключением двух:

1) obsolete a young male homosexual; catamite 
2) obsolete a prostitute


J0ker, вы какое имели ввиду? smile


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


Explorer
****


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

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



zim22, Punk - падонок(в современном мире так называют людей, которые пытаются выделится среди других своим идиотизмом)


--------------------
Мой блог
PM MAIL WWW   Вверх
J0ker
Дата 14.4.2009, 17:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(zim22 @  14.4.2009,  16:54 Найти цитируемый пост)
J0ker, вы какое имели ввиду?

http://www.urbandictionary.com/define.php?term=punk
http://www.merriam-webster.com/dictionary/punk
 a usually petty gangster, hoodlum, or ruffian 

Это сообщение отредактировал(а) J0ker - 14.4.2009, 17:13


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


depict1
****


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

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



Цитата(J0ker @  14.4.2009,  17:12 Найти цитируемый пост)
http://www.urbandictionary.com/define.php?term=punk

улыбнуло.
Цитата

A guy walks up to me and asks 'What's Punk?'. 
So I kick over a garbage can and say 'That's punk!'. 
So he kicks over the garbage can and says 'That's Punk?', and I say 'No that's trendy!



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



****


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

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



mes
предпочтительней или даже необходимо не писать код который производит ненужные действия, 

(особенно не приносящие пользы, увеличивающие время написания программы, увеличивающие объем бинарника программы, снижающие быстродействие программы)

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


любитель
****


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

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



Цитата(GoldFinch @  14.4.2009,  16:51 Найти цитируемый пост)
mes, 
предпочтительней или даже необходимо не писать код который производит ненужные действия, 

в принципе согласен..но способ достижения я выбрал бы другой, 
В грубом изложении я согласен отказаться от delete  (речь веду о С++ ),
но не в пользу брошенного без присмотра объекта, а в передачи прав на его удаление умному указателю. 
В общем всегда стараюсь придерживаться правила:  функция не знает o том, в каком контексте она работает.
Вы же, насколько я смог представить по Вашим постам, стараетесь нагрузить свою память лишними деталями.
В частности применительно к последним высказываниям, заставляете себя постоянно помнить в какой из функций хватает, а в какой не поставили освобождение памяти.
Хотя  гораздо легче просто писать симметрично.  smile 


Это сообщение отредактировал(а) mes - 14.4.2009, 18:21


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


Опытный
**


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

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



Цитата(GoldFinch @  14.4.2009,  17:51 Найти цитируемый пост)
предпочтительней или даже необходимо не писать код который производит ненужные действия

безусловно
т.е. теперь вы согласны, что уничтожать объекты и освобождать память необходимо?  smile 


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


uploading...
****


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

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



Цитата

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


Предпочтительней и даже необходимо писать код который будет читабельным и понятным. Преждевременная оптимизация - зло!
Программу можно оптимизировать сменив алгоритм, перейдя с С++ на С, в крайнем случае можно еще поизвращатся если нужно очень быстро - и это основные методы оптимизации. А не освобождать память это не то что преждевременная оптимизация, это почти доходит до маразма. Насколько вы повысите произодительность программы убрав delete или free? Просто посчитайте и вы поймете что оно того не стоит.

Добавлено через 2 минуты и 16 секунд
А насчет лишних действий - любая вызванная вами функция в той или иной степени выполняет что либо что возможно на первый взгляд вам и не нужно. Если хотите чтобы код делала только то что вы от него требуете и ничего более - единственный выход писать на ассемблере.
PM   Вверх
GoldFinch
Дата 14.4.2009, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(azesmcar @  14.4.2009,  19:38 Найти цитируемый пост)
Если хотите чтобы код делала только то что вы от него требуете и ничего более - единственный выход писать на ассемблере. 

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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



а что этот код должен делать?
PM MAIL Skype GTalk   Вверх
J0ker
Дата 14.4.2009, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(GoldFinch @  14.4.2009,  20:07 Найти цитируемый пост)
я хз что вы так уперлись в ассемблер 

не прикидывайтесь неджедаем  smile 


--------------------
user posted image
PM MAIL   Вверх
sdukshis
Дата 14.4.2009, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Если я правильно понял программу, то в ней важно, чтобы данные переписались в новый файл уже в отсортированном виде. Для этого Вы организуете считывание в map, который являясь упорядоченным деревом производит сортировку.

Или возможно Вам нужно исключить или обработать повторяющиеся данные

В первом случае лучше считывать данные в структуру типа vector (с заранее выделенной памятью) или list(хотя если можно заранее оценить размер данных, то лучше vector), а сортировку производить стандартными алгоритмами.

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

Вообще очень советую разбить программу на подпрограммы и произвести профилирование кода. Там сразу выплывет, какая часть кода занимает основное время.



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


depict1
****


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

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



Цитата(sdukshis @  14.4.2009,  22:00 Найти цитируемый пост)
В первом случае лучше считывать данные в структуру типа vector (с заранее выделенной памятью) 

зачем память заранее выделять? вектор умный - сам выделит и зарезервирует в придачу.

Цитата(sdukshis @  14.4.2009,  22:00 Найти цитируемый пост)
 или list...а сортировку производить стандартными алгоритмами.

если под сортировкой вы подразумеваете алгоритм sort из <algorithm>, то list в пролёте. у него BiDirrectional Iterators, а не RandomAccess. 
Хотя у list и есть встроенная функция-член sort, но мне кажется она работает медленнее, чем sort из <algorithm>


Это сообщение отредактировал(а) zim22 - 15.4.2009, 07:05


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


Explorer
****


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

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



Цитата(zim22 @  15.4.2009,  08:03 Найти цитируемый пост)
зачем память заранее выделять? вектор умный - сам выделит и зарезервирует в придачу.

если не выделить самостоятельно будут overheads

Цитата(zim22 @  15.4.2009,  08:03 Найти цитируемый пост)
Хотя у list и есть встроенная функция-член sort, но мне кажется она работает медленнее, чем sort из <algorithm>

у них одинаковая сложность


--------------------
Мой блог
PM MAIL WWW   Вверх
GoldFinch
Дата 15.4.2009, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(vinter @  15.4.2009,  09:02 Найти цитируемый пост)
одинаковая сложность

если написано что сложность O(N*log(N))
это может значить что в одном случае N*log(N) а в другом 100*N*log(N)
PM MAIL ICQ   Вверх
zim22
Дата 15.4.2009, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(GoldFinch @  15.4.2009,  08:17 Найти цитируемый пост)
это может значить что в одном случае N*log(N) а в другом 100*N*log(N)

насколько я знаю в O-нотации указывается верхняя граница сложности алгоритма. Т.е. гарантированно алгоритм выполниться за масимумум N*log(N) шагов


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


Explorer
****


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

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



Цитата(GoldFinch @  15.4.2009,  09:17 Найти цитируемый пост)
это может значить что в одном случае N*log(N) а в другом 100*N*log(N)

с чего бы это?


--------------------
Мой блог
PM MAIL WWW   Вверх
Lazin
Дата 15.4.2009, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



Цитата(vinter @  15.4.2009,  09:27 Найти цитируемый пост)
с чего бы это?

ну а почему мы обычно используем quik sort вместо merge sort? smile 
PM MAIL Skype GTalk   Вверх
vinter
Дата 15.4.2009, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



Lazin,  я тебя не понял, у алгоритма есть заявленная сложность. С чего бы ей увеличиваться?


--------------------
Мой блог
PM MAIL WWW   Вверх
Lazin
Дата 15.4.2009, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



О оценка, это еще не все, что можно сказать о сложности алгоритма
к примеру, quick sort имеет сложность O(N*log N) в большинстве случаев, а в худшем случае O(N*N), а у bucket sort сложность - O(N), но константа перед этим N и большее использование памяти приводят к тому, что он работает медленнее чем обычный quick sort в большинстве случаев smile 
PM MAIL Skype GTalk   Вверх
sdukshis
Дата 15.4.2009, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(zim22 @ 15.4.2009,  07:03)
Цитата(sdukshis @  14.4.2009,  22:00 Найти цитируемый пост)
В первом случае лучше считывать данные в структуру типа vector (с заранее выделенной памятью) 

зачем память заранее выделять? вектор умный - сам выделит и зарезервирует в придачу.

Цитата(sdukshis @  14.4.2009,  22:00 Найти цитируемый пост)
 или list...а сортировку производить стандартными алгоритмами.

если под сортировкой вы подразумеваете алгоритм sort из <algorithm>, то list в пролёте. у него BiDirrectional Iterators, а не RandomAccess. 
Хотя у list и есть встроенная функция-член sort, но мне кажется она работает медленнее, чем sort из <algorithm>

Проблему выбора между vector и list я вижу в следующем:

Оба эти контейнера умеют динамически увеличиваться в размере, но делают это по разному.

размер Vector растет как степень двойки, но при этом ему нужно осуществлять копирование элементов в новый участок памяти.
Поэтому если можно как-то оценить (я не говорю о точном кол-ве) размер входных данных, то можно pапросить выделение памяти всего 1 раз.

контейнер list запрашивает новую память при добавлении каждого элемента.

Отсюда и моё предложение, что лучше использовать vector если можно представить размер входных данных(например размер файла/среднюю длину строки).

Кроме того сортировка для vector может быть выполнена быстрее чем для list (может алгоритмическая сложность у них и одинакова, но просто попробуйте замерить на достаточно большом объёме данных, разница должна хорошо просматриваться).

Поиск повторений для обоих контейнеров примерно одинаковый, так что я за использование vector
PM MAIL   Вверх
zim22
Дата 15.4.2009, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(sdukshis @  15.4.2009,  13:30 Найти цитируемый пост)
лучше использовать vector если можно представить размер входных данных(например размер файла/среднюю длину строки).

полностью с вами соглашусь.


--------------------
PM MAIL   Вверх
GoldFinch
Дата 15.4.2009, 18:25 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



zim22vinter, вы перед тем как пользоваться умным математическим понятием порядка сложности, O[f(N)] узнали бы что это означает. Конечно труъ программистам математика наверное не нужна, но бездумно пользоваться терминами тоже не хорошо.

какбэ фраза "сложность алгоритма имеет порядок O[g(N)]" означает что для функции сложности f(N) существует такая окрестность точки n при которой при N->n отношение f(x)/g(x) ограничено 
в других определениях можно найти варианты "предел f(x)/g(x) при N->n существует и не равен нулю" или "... при N стремящемся к бесконечности ..."

так вот это значит что 10*N = O[100*N]
а также значит что может существовать m, такое что при N<m O[N*N]<O[N], что вобщем-то очевидно, если представить график параболы y=x*x и прямой y=x для x<1 


Это сообщение отредактировал(а) GoldFinch - 15.4.2009, 18:26
PM MAIL ICQ   Вверх
vinter
Дата 15.4.2009, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



Цитата(Lazin @  15.4.2009,  11:09 Найти цитируемый пост)
но константа перед этим N и большее использование памяти приводят к тому, что он работает медленнее чем обычный quick sort в большинстве случаев

отлично, но у нас нет никаких констант. Есть четкая верхняя граница.

Цитата(GoldFinch @  15.4.2009,  19:25 Найти цитируемый пост)
какбэ фраза "сложность алгоритма имеет порядок O[g(N)]" означает что для функции сложности f(N) существует такая окрестность точки n при которой при N->n отношение f(x)/g(x) ограничено в других определениях можно найти варианты "предел f(x)/g(x) при N->n существует и не равен нулю" или "... при N стремящемся к бесконечности ..."так вот это значит что 10*N = O[100*N]а также значит что может существовать m, такое что при N<m O[N*N]<O[N], что вобщем-то очевидно, если представить график параболы y=x*x и прямой y=x для x<1 

интересный экскурс, только причем он тут? O() это верхняя граница числа операций, которые могут быть пороизведены в данном алгоритме. И не надо никаких констант дописывать, туда, где их нет.


--------------------
Мой блог
PM MAIL WWW   Вверх
Lazin
Дата 15.4.2009, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



lol
PM MAIL Skype GTalk   Вверх
zim22
Дата 15.4.2009, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



http://en.wikipedia.org/wiki/Big_O_notation
Цитата

A description of a function in terms of big O notation usually only provides an upper bound on the growth rate of the function



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



****


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

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



Цитата(vinter @  15.4.2009,  19:57 Найти цитируемый пост)
O() это верхняя граница числа операций, которые могут быть пороизведены в данном алгоритме.

а O(1) это наверное 1 операция? на самом деле, это k операций, при этом k не зависит от N

zim22, "on the growth rate", вы понимаете разницу между самой функцией и ее производными?
скорость возрастания, это функция полученная из функции сложности, и в выражении O[g(N)] - g(N) это ее верхняя асимптотическая граница

Это сообщение отредактировал(а) GoldFinch - 15.4.2009, 19:38
PM MAIL ICQ   Вверх
vinter
Дата 15.4.2009, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



GoldFinch, OMG ты читай, что тебе пишут, а не то что ты хочешь читать. Я тебе еще раз повтаряю  сложность это ВЕРХНЯЯ ГРАНИЦА.
Цитата(GoldFinch @  15.4.2009,  20:37 Найти цитируемый пост)
это ее верхняя асимптотическая граница

где разночтение с моими словами или zim22?


--------------------
Мой блог
PM MAIL WWW   Вверх
GoldFinch
Дата 15.4.2009, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



vinter, верхняя граница чего? 
если алгоритм содержит 100*N операций, то его сложность O(N), а если он содержит 10*N операций, то его сложность тоже O(N)

и если алгоритм содержит 100000+N операций, его сложность тоже O(N), потому что предел отношения (100000+N)/N при N стремящемся к бесконечности конечен и не равен нулю, тоже самое и с пределом (10*N)/(100*N)

Это сообщение отредактировал(а) GoldFinch - 15.4.2009, 19:56
PM MAIL ICQ   Вверх
vinter
Дата 15.4.2009, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



GoldFinch, дык, константа не зависит от N, естественно. Но в конкретном прмере не было никаких констант. Была конкретная сложность. Прямым текстом:
Цитата(standard)

Complexity: Approximately N log(N) (where N == last - first) comparisons on the average

Вот, все. После чего ты начал приплетать, какие то левые константы, которые вообще не имеют отношения к конкретной сложности...


--------------------
Мой блог
PM MAIL WWW   Вверх
GoldFinch
Дата 15.4.2009, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



vinter, изначально разговор был о том, что у разных алгоритмов при одинаковой сложности O[g(N)] может быть разное время выполнения
PM MAIL ICQ   Вверх
vinter
Дата 15.4.2009, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



GoldFinch, твоя правда. 


--------------------
Мой блог
PM MAIL WWW   Вверх
J0ker
Дата 15.4.2009, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



сложность алгоритма сортировки показвает изенение времени выполнения при изменении n
прямого отношения к сравнению алгоритмов между собой это не имеет


--------------------
user posted image
PM MAIL   Вверх
vinter
Дата 16.4.2009, 05:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


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

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



Цитата(J0ker @  15.4.2009,  23:09 Найти цитируемый пост)
прямого отношения к сравнению алгоритмов между собой это не имеет

понятие сложнсти было придумано,как раз для сравнения алгоритмов. Так, что имеет.


--------------------
Мой блог
PM MAIL WWW   Вверх
J0ker
Дата 16.4.2009, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(vinter @ 16.4.2009,  05:26)
Цитата(J0ker @  15.4.2009,  23:09 Найти цитируемый пост)
прямого отношения к сравнению алгоритмов между собой это не имеет

понятие сложнсти было придумано,как раз для сравнения алгоритмов. Так, что имеет.

я сазал прямого отношения
big O между алгоритмами можно сравнивать исключительно после обсуждения сложности итерации
и понятие сложности было придумано в первую очередь для указания отношния времени выполнения к n

Это сообщение отредактировал(а) J0ker - 16.4.2009, 16:29


--------------------
user posted image
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.2081 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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