仅使用一个元素传递 IEnumerable 与传递元素本身的成本
Cost of passing IEnumerable with only one element vs passing the element itself
我正在开发一个数据采集系统,它有一些基于事件的数据流。
通常有 NewDataAvailableArgs
class,其中 returns 一个或多个新值。
我的疑问是:我是否应该有两个不同的 arg classes,如下所示:
class NewManyDataAvailableArgs
{
public IEnumerable<int> Values { get; private set; }
public NewDataAvailableClass(IEnumerable<int> values)
{
values = Values;
}
}
class NewSingleDataAvailableArgs
{
public int Value { get; private set; }
public NewDataAvailableClass(int value)
{
value = Value;
}
}
或者我是否应该停止担心,只使用一个包含单个元素的集合,以防我只有一个值要传递?
举例来说,恐怕我最终会引发太多这样的事件,(可能是不必要的)创建一个新数组只是因为构造函数签名是这样说的:
Something.NewDataAvailable(this, new DataAvailable(new int[] { single_value });
我应该更喜欢单一签名,还是这种 "overload" 事件?是性能问题、风格问题,还是只是偏好问题?
客户是特别关心只有一个元素这一事实,还是不管有多少元素,他们都对集合一视同仁?只有当有消费者会使用它时,专门的事件才是一个好主意。如果消费者所做的只是 foreach 遍历项目并打印它们,那么特殊事件就没有用了。
关于性能,我可以想象单值版本可以节省分配,但架构成本似乎很高。
我认为最好的方法是使用 IEnumerable 的一种情况,因为内存开销不是那么大,只会为指向您存储的一个值的指针分配一些额外的字节。如果你想在一行中适应一个集合的所有独特流程案例,这是你必须做出的妥协。所以简而言之,是的,你失去了一些可能不明显的性能,但你获得了代码可读性。
我正在开发一个数据采集系统,它有一些基于事件的数据流。
通常有 NewDataAvailableArgs
class,其中 returns 一个或多个新值。
我的疑问是:我是否应该有两个不同的 arg classes,如下所示:
class NewManyDataAvailableArgs
{
public IEnumerable<int> Values { get; private set; }
public NewDataAvailableClass(IEnumerable<int> values)
{
values = Values;
}
}
class NewSingleDataAvailableArgs
{
public int Value { get; private set; }
public NewDataAvailableClass(int value)
{
value = Value;
}
}
或者我是否应该停止担心,只使用一个包含单个元素的集合,以防我只有一个值要传递? 举例来说,恐怕我最终会引发太多这样的事件,(可能是不必要的)创建一个新数组只是因为构造函数签名是这样说的:
Something.NewDataAvailable(this, new DataAvailable(new int[] { single_value });
我应该更喜欢单一签名,还是这种 "overload" 事件?是性能问题、风格问题,还是只是偏好问题?
客户是特别关心只有一个元素这一事实,还是不管有多少元素,他们都对集合一视同仁?只有当有消费者会使用它时,专门的事件才是一个好主意。如果消费者所做的只是 foreach 遍历项目并打印它们,那么特殊事件就没有用了。
关于性能,我可以想象单值版本可以节省分配,但架构成本似乎很高。
我认为最好的方法是使用 IEnumerable 的一种情况,因为内存开销不是那么大,只会为指向您存储的一个值的指针分配一些额外的字节。如果你想在一行中适应一个集合的所有独特流程案例,这是你必须做出的妥协。所以简而言之,是的,你失去了一些可能不明显的性能,但你获得了代码可读性。