Время создания объекта C ++ - PullRequest
0 голосов
/ 09 мая 2020

Итак, я создаю что-то вроде поиска A * и создаю объекты, как показано ниже, когда это необходимо в моем алгоритме. Дело в том, что на создание каждого из них уходит 0,1 секунды. Мой поиск занимает 40 секунд, 39 секунд из которых - создание объекта.

Я действительно понятия не имею. Довольно новый. Любая помощь приветствуется.

class Node{
private:
    int numAncestors;
    float gvalue;
    float hvalue;
    float fvalue;
    int adj;
    Node* parent;
public:
    inline Node(int vertex, int goal, vector< vector<double> > xy){

        adj = vertex - 1;
        float x1 = (float)xy[vertex-1][0];
        float y1 = (float)xy[vertex-1][1];
        float x2 = (float)xy[goal-1][0];
        float y2 = (float)xy[goal-1][1];
        hvalue = sqrtf((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1));
        //fvalue = hvalue + gvalue;
    }
    inline float getF(){
        return hvalue + gvalue;
    }

    inline void setG(float newG){
        gvalue = newG;
    }
    inline float getG(){
        return gvalue;
    }

    inline int getAncestors(){

        return numAncestors;
    }

    void setAncestors(int ancestors){

        numAncestors = ancestors;
    }
    void setParent(Node* n, vector< vector<double> > xy){

        parent = n;
        float x1 = (float)xy[n->getAdj()][0];
        float y1 = (float)xy[n->getAdj()][1];
        float x2 = (float)xy[adj][0];
        float y2 = (float)xy[adj][1];
        float x = sqrtf((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1));

        setG(n->getG() + x);
        setAncestors(n->getAncestors()+1);
     }

    inline Node* getParent(){

        return parent;
    }

    inline int getAdj(){

        return adj;
    }
};

Это занимает 0,1 секунды:

clock_t nodetest = clock();    
Node* s = new Node(g,e,xy);
printf("Time taken: %.2fs\n", (double)(clock() - nodetest)/CLOCKS_PER_SEC);

Это занимает 0,0 секунды:

clock_t thisLoop = clock();
float x1 = (float)xy[x-1][0];
float y1 = (float)xy[x-1][1];
float x2 = (float)xy[current->getAdj()][0];
float y2 = (float)xy[current->getAdj()][1];
float x = sqrtf((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1));
printf("Time taken: %.2fs\n", (double)(clock() - thisLoop)/CLOCKS_PER_SEC);

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

1 Ответ

3 голосов
/ 09 мая 2020

Когда вы вызываете конструктор Node, вы передаете xy по значению , что означает, что создается копия всего массива. Вы должны передать его через ссылку на константу :

Node(int vertex, int goal, const vector<vector<double>> &xy)

Это также должно быть сделано для setParent.

Другие примечания:

* Конструктор 1015 * не инициализирует всех своих членов. В частности, parent будет иметь значение мусора, что может привести к появлению странных ошибок позже.

Конструктор Node и setParent совместно используют кучу кода, который выполняет некоторую работу. Это должно быть помещено в (частную) функцию-член, которую можно вызывать, чтобы избежать дублирования кода.

Различные функции get могут быть const, например float getF() const;.

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

...