Dan*_*Tao 0 .net c# performance constructor struct
实际上,我有两个问题.但他们密切相关.
假设我有一个struct
像这样的简单:
public struct TradePrice {
public float Price;
public int Quantity;
public TradePrice(float price, int quantity) {
Price = price;
Quantity = quantity;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我在某处需要访问这些值的代码,那么执行此操作之间是否有任何区别:
TradePrice tp = new TradePrice(50.0f, 100);
Run Code Online (Sandbox Code Playgroud)
还有这个:
float p = 50.0f;
int q = 100;
Run Code Online (Sandbox Code Playgroud)
我觉得第一个,因为它调用一个构造函数,应该有类似方法调用的开销.但这只是猜测.
上述问题的答案实际上也可能回答了这个问题,但也许有一些微妙之处使得这些情景不同; 所以无论如何我会问.假设我有一个struct
本身就有struct
类型的成员.像这样:
public struct BidAsk {
public TradePrice Bid;
public TradePrice Ask;
}
Run Code Online (Sandbox Code Playgroud)
那么这三种方法之间会有什么区别吗?
Reset(TradePrice bid, TradePrice ask) {
Bid = bid;
Ask = ask;
}
Reset(float bidPrice, int bidQuantity, float askPrice, int askQuantity) {
Bid = new TradePrice(bidPrice, bidQuantity);
Ask = new TradePrice(askPrice, askQuantity);
}
Reset(float bidPrice, int bidQuantity, float askPrice, int askQuantity) {
Bid.Price = bidPrice;
Bid.Quantity = bidQuantity;
Ask.Price = askPrice;
Ask.Quantity = askQuantity;
}
Run Code Online (Sandbox Code Playgroud)
我倾向于认为a的构造函数有一些开销struct
,因此即使在上述方法中传递/设置了相同数量的数据,第一个和最后一个可能稍微更有效.这是真的?第一种也是最后一种方法甚至不同?
为了记录在案,我不是问这个,因为我错误地认为这是从设计的角度来看有助于性能瓶颈或者说,它特别的问题(尽管也许有人会争辩说,它让我感到吃惊呢).我问,因为我只是好奇.
你首先需要解决更大的问题.这段代码闻起来很糟糕.
问题#1:您使用二进制浮点数来表示财务数量.二进制浮点数被设计用于表示科学量,其中精确度的最后几位中的微小误差是不重要的.它们非常不适合代表确切的金融数量.如果您要表示金融数量,请始终使用小数,不要使用浮点数.
问题2:假设您有充分的理由使用二进制浮点数,请不要使用float.使用双.现代硬件经过优化,可以进行双精度算术,而不是单精度; 在某些情况下,单精度实际上较慢.当然,double占用的内存是float的两倍,但除非你在内存中同时拥有几百万这些内存,否则它无关紧要.此外,你应该使用十进制,这比浮动大四倍.
问题3:你有一个可变的值类型.可变值类型是纯粹的邪恶.使用可变值类型意外地导致错误很容易.避免避免.
问题#4:这真的是结构的正确名称吗?我认为"交易价格"将由Price属性表示.是否有一个更好的名称,更清楚地描述它代表什么?它是否代表了您的业务领域中的一些明确概念?
问题5:你没有对传递给公共结构的公共构造函数的参数进行验证.这似乎很危险.如果有人试图以每股-100000.00的价格交易-100股,该怎么办?怎么了?没什么好的,我敢打赌.
问题#6:struct的默认值应该始终是struct的有效实例.是吗?这个结构的默认实例是Price = 0,Quantity = 0.这实际上有意义吗?如果没有,那么不要将其作为结构.把它变成一个班级.
问题#7:这首先是逻辑上的值类型吗?为什么它是一个结构?这种东西你觉得应该被逻辑地视为一个值,比如12号,或者逻辑上你可以在多个地方引用"同一件事",比如顾客?如果它在逻辑上不是值,请不要使用值类型.
假设名称是正确的,并且这在逻辑上是值类型,您的代码应该是这样的:
public struct TradePrice
{
public decimal Price {get; private set;}
public int Quantity {get; private set; }
public TradePrice(decimal price, int quantity) : this()
{
if (price < 0m) throw new ...
if (quantity < 0) throw new ...
this.Price = price;
this.Quantity = quantity;
}
}
Run Code Online (Sandbox Code Playgroud)
至于你的实际问题:没有逻辑上的区别.有可能是一个性能上的差异.我对这里是否存在可衡量的性能差异一无所知.你已经用两种方式写了代码.拿一个秒表,双向运行十亿次,然后你就会知道问题的答案.