所以我可能想要在一条线上运行的各种功能:
inline float yIntercept(const vec2& ptA, const vec2& ptB, float x);
inline float xIntercept(const vec2& ptA, const vec2& ptB, float y);
inline bool lineIntersection(const vec2& ptA0, const vec2& ptB0, const vec2& ptA1, const vec2& ptB1);
对于代表该行的每一行,函数需要2个点。
或者我可以编写一个包含这两个点的线类和各种有用的线相关方法。
struct Line {
... stuff
inline float xIntercept(float y);
inline float yIntercept(float x);
inline bool lineIntersection(const Line& other);
vec2 m_point[2];
};
我想到的一件事就是每当我需要调用其中一个函数给出2分时,就创建这个行类的实例。
我可能在表示多边形的点列表上操作,并且实际上没有实例化任何线对象。
我可以随时致电
yIntercept(somePointA, somePointB, 3.0f);
或
Line(somePointA, somePointB).yIntercept(3.0f); //I think this would compile
我喜欢为这些类型的东西而不是C样式函数创建类的想法,但我想知道是否存在创建类的实例这样的性能损失,而不是仅仅将点传递给函数。也许编译器做了一些优化?
答案 0 :(得分:1)
我正在考虑的一件事是创建实例的性能 每次我需要调用其中一个函数时,这个行类 只给了2分。
如果您的应用程序确实存在问题,那么您可能“做错了”。我的意思是,做得对,创建这个对象的代码应该非常轻量级。即便如此,你真的需要创造很多这样的对象 - 构成线条的“事物”随着时间的推移而不是主张,所以struct Line可以以某种方式成为覆盖对象的一部分。
例如,在多边形中,您可以从点列表中创建Line对象,并保留它们。
我还要先编写一个通用的,运行良好的代码库,然后在一切正常工作时进行优化。如果你必须重写一些东西,那就这样吧。希望您已经使您的界面足够通用,您不必重写太多其他代码。
无论何时进行性能优化,请确保您进行测量,再次测量,并记下您为改变它所做的工作。我有时在电子表格中有几百行,“尝试修改X”,“在功能A中使用聪明的技巧”,结果 - 有时结果是“丢失5%”(或“损失500%”),但是至少你知道结果是什么。使用“我认为编译器将执行此操作”需要很多任何给定编译器的经验。
答案 1 :(得分:1)
根据其他因素选择解决方案。或许是努力或可读性。
采用这种方法的原因是因为您在这两种情况中进行选择:
Line
个对象的额外工作。编译器可以对1.或2进行优化。它可能会。或不。它可能会有所帮助。或者不是。
请参阅此文章,详细了解与您类似的优化决策。作者没问题。
http://www.codinghorror.com/blog/2009/01/the-sad-tragedy-of-micro-optimization-theater.html