【发布时间】:2014-01-23 18:19:55
【问题描述】:
出于某种原因,我的LinkedList 似乎优于我的List。我有一个LinkedList,因为有一部分代码我必须重新安排孩子们很多。重新排列之后的一切只是循环数据并执行计算。我之前只是使用Iterator 迭代LinkedList,但后来我认为我应该同时存储相同元素的List,这样我可以更快地迭代它们。不知何故,添加List 并对其进行迭代对于完全相同的事情要慢得多。不知道这是怎么回事,所以任何信息都有帮助。
这大概是我希望更快的代码:
class Program {
public static void Main(string[] args) {
var originalList = new List<Thing>();
for (var i = 0; i < 1000; i++) {
var t = new Thing();
t.x = 0d;
t.y = 0d;
originalList.Add(t);
}
var something = new Something(originalList);
for (var i = 0; i < 1000; i++) {
var start = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
something.iterate();
time += (DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - start;
Console.Out.WriteLine(time / (i + 1));
}
}
class Thing {
public double x {get; set;}
public double y {get; set;}
}
class Something {
private List<Thing> things;
private LinkedList<Thing> things1 = new LinkedList<Thing>();
private List<Thing> things2 = new List<Thing>();
public Class(List<Thing> things) {
this.things = things;
for (var i = 0; i < things.Count; i++) {
things1.AddLast(things[i]);
things2.Add(things[i]);
}
}
public void iterate() {
//loops like this happen a few times, but the list is never changed, only the
//objects properties in the list
for (var i = 0; i < things2.Count; i++) {
var thing = things2[i];
thing.x += someDouble;
thing.y += someOtherDouble;
}
}
}
}
这是我首先要做的,我认为应该更慢:
class Program {
public static void Main(string[] args) {
var originalList = new List<Thing>();
for (var i = 0; i < 1000; i++) {
var t = new Thing();
t.x = 0d;
t.y = 0d;
originalList.Add(t);
}
var something = new Something(originalList);
for (var i = 0; i < 1000; i++) {
var start = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
something.iterate();
time += (DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond) - start;
Console.Out.WriteLine(time / (i + 1));
}
}
class Thing {
public double x {get; set;}
public double y {get; set;}
}
class Something {
private List<Thing> things;
private LinkedList<Thing> things1 = new LinkedList<Thing>();
public Class(List<Thing> things) {
this.things = things;
for (var i = 0; i < things.Count; i++) {
things1.AddLast(things[i]);
}
}
public void iterate() {
//loops like this happen a few times, but the list is never changed, only the
//objects properties in the list
var iterator = things1.First;
while (iterator != null) {
var value = iterator.Value;
value.x += someDouble;
value.y += someOtherDouble;
iterator = iterator.Next;
}
}
}
}
【问题讨论】:
-
你到底是如何进行基准测试的?构造函数的成本是否包含在您的测量中,每个实例调用
iterate()的频率是多少? -
检查这个:列表与链接列表。 stackoverflow.com/questions/169973/…
-
我什至无法编译它。请帮我解决 public Class(List
things) 的语法。 -
@tau:确保附上基准测试代码,即使它看起来微不足道。 如何执行基准测试的重要性不亚于其主题。
-
所以据说:你需要更大的列表(或在
Main中对整个循环进行计时)才能使DateTime.Now完全有用。它的分辨率通常与系统计时器相关联,在 NT 中,系统计时器的间隔为 10 毫秒。一旦 JITter 参与其中,10 毫秒是一个非常 长的时间。 (据说有一个Stopwatch类更适合基准测试。试试吧。)
标签: c# .net performance data-structures