Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
volchonokilli
4 / 4 / 0
Регистрация: 04.01.2012
Сообщений: 41
#1

Оптимизация работы метода класса с объектами класса [C++] - C++

24.04.2012, 23:35. Просмотров 965. Ответов 13
Метки нет (Все метки)

Здравствуйте!
Я хочу сделать 25 000 объектов класса, в последствии они все будут разными, но сейчас, для упрощения задачи, я делаю их одинаковыми.
Собственно, вопрос в том, как это сделать быстро.
Приведённый ниже код, с использованием метода класса делает это ОЧЕНЬ долго.

Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
 
using namespace std;
 
int num=0;
 
void main()
{
    class tile
    {
    public:
        static tile change()
        {
            tile temp;
            temp.num=::num;
            temp.mapp='\xDB';
            return temp;
        }
    private:
            int num;
            char mapp;
    };  
    tile ti[25000];
    for(int i=0;i!=24999;++i)
    {
        ti[i] = tile::change();
        ++::num;
    }
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.04.2012, 23:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Оптимизация работы метода класса с объектами класса [C++] (C++):

Передача метода класса в качестве параметра для метода другого класса - C++
Здравствуйте, Передо мной стоит такая задача. Необходимо разработать механизм, который бы мог прервать любую функцию, при этом абсолютна...

Реализуйте интерфейс динамической структуры list для работы с объектами класса А - C++
Добрый день товарищи программисты. Столкнулся с задачей и никак не могу решить... Так вот вопросы по заданию заключаются в следующем: ...

Вызов метода производного класса через обращение к методу базового класса - C++
Добрый день. Изучаю основы ООП, наткнулся на проблему. Если создавать классы внутри main.cpp, то всё нормально. Если же создавать в...

Ошибка при вызове метода класса в методе другого класса - C++
Господа программисты, возникла такая проблема. При вызове метода класса в методе другого класса выходит такая ошибка &quot; нестандартный...

Вызов метода класса из метода другого класса - C++
Помогите школнегу Имеется несколько классов class Com { protected: unsigned char bufrd, bufwr; unsigned char tx_index,...

Вызов динамического метода класса по указателю на объект класса - C++
Как это можно сделать? И хотелось бы как можно проще.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
25.04.2012, 00:02 #2
быстро или медленно - это все понятия относительные. а оптимизация - вообще зло.
класс будет именно таким как тут? с парой меберов из встроенных типов?
очень долго относительно чего?
чем измеряли?
откуда такая подребность в быстром создании?
0
volchonokilli
4 / 4 / 0
Регистрация: 04.01.2012
Сообщений: 41
25.04.2012, 00:08  [ТС] #3
Ну, я хочу сделать двухмерную игру с псевдослучайной генерацией мира.
С возможностью удаления, изменения каждой "клетки".
У "клетки" есть свой номер, необходимый для той системы, которую я придумал, и знак отображения на экране (ASCII).
Я предполагал, что сначала все "клетки" будут одинаковыми, а потом уже будут перезаписываться, превращаться в элементы других классов, которые наследуются от этого класса.
Насчёт времени...
Я пять минут ждал, и процесс и не думал прекращаться.
0
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
25.04.2012, 00:14 #4
где-то у вас в другом месте проблема. тот код, который вы тут написали выполняется почти мнгновенно. именно такой код на общую производительность проекта не должен влиять. проблемы будут в других местах. а то, что у вас сейчас это 5 минут выполняется - это очень странно. вы наверно что-то напутали
1
volchonokilli
4 / 4 / 0
Регистрация: 04.01.2012
Сообщений: 41
25.04.2012, 00:19  [ТС] #5
Цитата Сообщение от DU Посмотреть сообщение
где-то у вас в другом месте проблема. тот код, который вы тут написали выполняется почти мнгновенно. именно такой код на общую производительность проекта не должен влиять. проблемы будут в других местах. а то, что у вас сейчас это 5 минут выполняется - это очень странно. вы наверно что-то напутали
Ох, действительно, я случайно вставил у себя в коде cout.
Боже, иногда ошибки бывают там, где их точно не ожидаешь ><

Ну да ладно, раз всё-таки я создал тему, не подскажите мне алгоритм создания кругов разных размерностей?
Где размерность - некое случайное число больше единицы.
0
PointsEqual
ниначмуроФ
836 / 520 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
25.04.2012, 00:23 #6
чтобы было еще быстрее можно избавиться от change() и заменить ее конструктором по умолчанию
0
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
25.04.2012, 00:24 #7
под размерностью имеется в виду радиус? или вам нужны n-мерные круги? ну генерите радиусы случайным образом. вот и будут круги с случайным радиусов. функия rand умеет генерить псевдослучайное число. если она не устраивает, нужно это отдельно в сети искать, как нагенерить что-то максимально случайно.
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
25.04.2012, 00:24 #8
Можно избежать лишних копий, в принципе
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int num = 0;
 
int main() {
    class tile {
    public:
        tile() : num(::num++), mapp('\xDB') {}
        
    private:
        int num;
        char mapp;
    };
    
    
    tile t[25000];
    
}
Только непонятен смысл оптимизации такого крошечного кусочка кода. Да и ваш изначальный код вроде должен выполниться достаточно быстро.
1
PointsEqual
ниначмуроФ
836 / 520 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
25.04.2012, 00:27 #9
наверно вам нужно что-то типа этого
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class tile
{
public:
  tile() : id(num), mapp('\xDB')
  {
      ++ num;
  }
 
private:
  int id;
  char mapp;
  static int num;
};
 
int tile::num = 0;
1
volchonokilli
4 / 4 / 0
Регистрация: 04.01.2012
Сообщений: 41
25.04.2012, 00:33  [ТС] #10
Спасибо за ответы, я только начал работать с классами более плотно, на будущее буду знать

Цитата Сообщение от DU Посмотреть сообщение
под размерностью имеется в виду радиус? или вам нужны n-мерные круги? ну генерите радиусы случайным образом. вот и будут круги с случайным радиусов. функия rand умеет генерить псевдослучайное число. если она не устраивает, нужно это отдельно в сети искать, как нагенерить что-то максимально случайно.
Я имел в виду, по какой формуле делается круг, например, радиус его 8, и внутри он должен быть тоже "заполнен".
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
25.04.2012, 11:20 #11
Цитата Сообщение от DU Посмотреть сообщение
а оптимизация - вообще зло.
Ха-ха-ха
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,542
Завершенные тесты: 3
25.04.2012, 13:21 #12
Kuzia domovenok, Ничего смешного. Преждевременная оптимизация - зло. Оптимизация не по теме - тоже. Компилятор может оптимизировать куда лучше программиста.
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
25.04.2012, 17:42 #13
Цитата Сообщение от ForEveR Посмотреть сообщение
Kuzia domovenok, Ничего смешного. Преждевременная оптимизация - зло. Оптимизация не по теме - тоже. Компилятор может оптимизировать куда лучше программиста.
тот кто это сказал, очевидно имел в виду мелкую оптимизацию по мелочам, вроде параноидальной замены всех умножений на сдвиги и сложения,
всех постинкрементов на преинкременты
и прочую мелкую ерунду.
Пользоваться же оптимальными высокоуровневыми алгоритмами надо всегда
И гораздо хуже будет, если после того как программа написана выясняется, что производительность недостаточна
и требуется заменить всё, начиная с основных типов данных
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
25.04.2012, 17:47 #14
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Пользоваться же оптимальными высокоуровневыми алгоритмами надо всегда
Сами алгоритмы надо оптимизировать, да.
Их реализацию - только когда код уже гарантированно работает и инкапсулирован от всего внешнего мира. До этого же лучше пессимизировать в пользу понятности кода, чем оптимизировать за счет этой же понятности.
Суть в том, что сделать из быстрого кода корректный намного сложнее, чем из корректного быстрый.

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
всех постинкрементов на преинкременты
и прочую мелкую ерунду.
Замена постинкрементов на преинкременты - это хороший стиль и отсутствие пессимизации, а не оптимизация.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.04.2012, 17:47
Привет! Вот еще темы с ответами:

Обработка метода класса в зависимости от типа данного класса - C++
Имеется класс родителя A с методом Update(), этот класс имеет 2 дочерних класса B, C, каждый из них имеет свой метод обработки Update:...

Вызов метода внутреннего класса методом внешнего класса - C++
Не могу разобраться как реализовать вложенный класс и как его вызвать. Занимаюсь по Лафоре, про вложенные классы ничего, а задача в конце...

Вызов метода класса без создания экземпляра класса. - C++
В общем мне для функционирования одной программы нужно постоянно вызывать метод одного из классов. Я это делаю с помощью new - delete. Мне...

Не удается обратиться к свойству класса из метода класса - C++
Пишу хедер для работы с файлами такой структуры: nametype1 name1 name2 name3 name4 nametype2


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.04.2012, 17:47
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru