Pull to refresh

Comments 10

А affinity потокам выставлялся? Смею предположить, что при этом результаты должны слегка улучшится в теории, особенно, если освободить ядра под задачи. И ваш тест с наблюдением fps мог бы оказаться не очень показательным а 15% слишком близко к погрешности, может у вас windows при первых замерах обновлялся или ещё чего за кадром происходило.

Многопоточный код одинаковый для обеих версий. В стандартной библиотеке нет возможности выставлять affinity, но не думаю, что в данном примере это повлияло бы. Тесты/профилирование проводил несколько раз. Но ошибки в коде не исключаю.
UFO just landed and posted this here

Ну, если для чистоты эксперимента многопоточный код хотя бы не был кинут на освобождённые под него ядра, то где тут чистота? Разве что погода на Марсе особо не повлияет, и то не факт.


Можно было хотя бы освободить n ядер под процесс, системными средствами. Под windows не помню на память (но как то из ps делается), под linux это тот же taskset. Тут же важно, что бы ядра в момент эксперимента не делились ни с какими другими процессами в системе, хватит и того, что память по сути одна.

Я бы предложил улучшить ваш код следующим образом. Можно попробовать расположить данные в виде Struct Of Arrays, но писать код так, как будто у вас Array of Structs. Для этого с фигурами надо работать через специальный wrapper, который будет получать данные из массивов. Интересно было бы замерить производительность такой версии, по идее она должна быть такой же, как и версии с прямым доступам к массивам. Выглядеть это будет примерно так:

class ShapeRef;

struct ShapesData {
    friend class ShapeRef;

public:
    ShapeRef getShape(size_t i);
	
private:
    // векторы данных будут закрытыми
    std::vector<math::Vec2> positions;
    ...
};

class ShapeRef {
public:
    ShapeRef(ShapesData & d, size_t i):
        data{d}, index{i} {}

    const math::Vec2 & getPosition() const {
        return data.positions[index];
    }

    void setPosition(const math::Vec2 & pos) {
        data.positions[index] = pos;
    }

    // методы для доступа к остальным данным фигур

private:
    ShapesData & data;
    size_t index;
};

inline ShapeRef ShapesData::getShape(size_t i) {
    return ShapeRef(*this, i);
}
Хороший комментарий, спасибо. Хоть я и не писал об этом, но предполагается использование подобных врапперов для удобства. Если геттеры будут заинлайнены, то разницы в производительности не будет.
64KB / sizeof(int) = 16

Вы серьезно считаете что int занимает в памяти 4KB?
UFO just landed and posted this here
Sign up to leave a comment.

Articles