或者让我给予一个具体的例子。假设我写了一个返回List<int>的所有子集的方法,令n = .Count,我知道有n^2个子集(假设存储为List<int> s),每个子集的大小在1到n之间,因此我知道分配n ^2 * n * sizeof(int) + [一些额外空间]应该能打开足够的空间。我希望我为子集创建的每个new List<int>(capacity: n)都能快速分配。有没有办法做这个预分配,还是我的想法全错了?
List<int>
n
.Count
1
sizeof(int)
new List<int>(capacity: n)
xxslljrj1#
从技术上讲,您可以创建所有的列表,并使用您要填充的项目数来填充它们,但您也可以使用垃圾来填充它们,然后覆盖这些值。但是,您不应该投入太多精力来优化一个代码,它不是(还)有性能问题。你应该以最自然的方式实现你的程序,并确保它工作。测量时间。做压力测试。如果你有性能问题,那么当你有问题时,你会比以前有更多关于这个问题的信息,当你计划你的代码时。你可能会试图优化一个无论如何都不会存在的问题。所以,如果你担心你的方法的性能,那么你也应该实现“创建”和“添加”到你要返回的子列表中。首先,你可以把创建实现为newList,把添加实现为对.Add()方法的调用。以后,如果你最终遇到性能问题,那么你将改变这些方法,这样,“创建”将仅返回已经创建的列表,而“添加”将仅改变索引处的值。
new
List
.Add()
9vw9lbht2#
List<T>构造函数接受一个可选的capacity参数,该参数告诉列表要预分配多少个元素。
List<T>
capacity
2条答案
按热度按时间xxslljrj1#
从技术上讲,您可以创建所有的列表,并使用您要填充的项目数来填充它们,但您也可以使用垃圾来填充它们,然后覆盖这些值。
但是,您不应该投入太多精力来优化一个代码,它不是(还)有性能问题。你应该以最自然的方式实现你的程序,并确保它工作。测量时间。做压力测试。如果你有性能问题,那么当你有问题时,你会比以前有更多关于这个问题的信息,当你计划你的代码时。你可能会试图优化一个无论如何都不会存在的问题。
所以,如果你担心你的方法的性能,那么你也应该实现“创建”和“添加”到你要返回的子列表中。首先,你可以把创建实现为
new
List
,把添加实现为对.Add()
方法的调用。以后,如果你最终遇到性能问题,那么你将改变这些方法,这样,“创建”将仅返回已经创建的列表,而“添加”将仅改变索引处的值。9vw9lbht2#
List<T>
构造函数接受一个可选的capacity
参数,该参数告诉列表要预分配多少个元素。