Tôi đang chạy AQTime trên đoạn mã này, tôi thấy rằng .IndexOf mất 16% thời gian so với gần 80% cho phần khác ... Chúng dường như sử dụng cùng một IsEqual và các thường trình khác. Được gọi là 116.000 lần chèn 30.000 mặt hàng. Không có đối tượng nào trong Danh sách <> nhận hơn 200 phần tử. (Tôi có thể sử dụng AQTime không chính xác, tôi đang xem xét điều này)Tại sao Danh sách này <>. Mã IndexOf nhanh hơn nhiều so với Danh sách [i] và so sánh thủ công?
class PointD : IEquatable<PointD>
{
public double X, Y, Z;
bool IEquatable<PointD>.Equals(PointD other)
{
return ((X == other.X) && (Y == other.Y) && (Z == other.Z));
}
}
class PerfTest
{
readonly List<PointD> _pCoord3Points = new List<PointD>();
public int NewPoints;
public int TotalPoints;
public PerfTest()
{
NewPoints = 0;
TotalPoints = 0;
}
public int CheckPointIndexOf(PointD pt)
{
int retIndex = _pCoord3Points.IndexOf(pt);
if (retIndex < 0)
{
_pCoord3Points.Add(pt);
NewPoints++;
}
TotalPoints++;
return retIndex;
}
public int CheckPointForBreak(PointD pt)
{
int retIndex = -1;
for (int i = 0; i < _pCoord3Points.Count; i++)
{
PointD otherPt = _pCoord3Points[i];
if ((pt.X == otherPt.X) &&
(pt.Y == otherPt.Y) &&
(pt.Z == otherPt.Z))
{
retIndex = i;
break;
}
}
if (retIndex == -1)
{
NewPoints++;
_pCoord3Points.Add(pt);
}
TotalPoints++;
return retIndex;
}
static void Main()
{
const int xmax = 300;
const int ymax = 10;
const int zmax = 10;
const int imax = 4;
var test = new PerfTest();
//test.Init();
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < imax; i++)
{
for (int x = 0; x < xmax; x++)
{
for (int y = 0; y < ymax; y++)
{
for (int z = 0; z < zmax; z++)
{
var pt = new PointD { X = x, Y = y, Z = z };
test.CheckPointIndexOf(pt);
}
}
}
}
sw.Stop();
string output = string.Format("Total: {0:0} New: {1:0} IndexOf: ", test.TotalPoints, test.NewPoints);
Console.Write(output);
Console.WriteLine(sw.Elapsed);
test = new PerfTest();
sw = Stopwatch.StartNew();
for (int i = 0; i < imax; i++)
{
for (int x = 0; x < xmax; x++)
{
for (int y = 0; y < ymax; y++)
{
for (int z = 0; z < zmax; z++)
{
var pt = new PointD { X = x, Y = y, Z = z };
test.CheckPointForBreak(pt);
}
}
}
}
sw.Stop();
output = string.Format("Total: {0:0} New: {1:0} PointD[] ", test.TotalPoints, test.NewPoints);
Console.Write(output);
Console.WriteLine(sw.Elapsed);
Console.ReadLine();
}
}
là thực sự 'IndexOf' nhanh hơn? Khi tôi cố gắng tái tạo 'IndexOf' chậm hơn đáng kể, và tôi cho rằng suy đoán của Jon về boxing là đúng. –
Tôi nhận được kết quả ngược lại chính xác, IndexOf chậm hơn 20 lần khi PointD là một cấu trúc. Phương thức Equals() của một cấu trúc không phải là rẻ. Đăng một ví dụ có thể xác minh * thực *. –
Ah, nếu IndexOf nhanh hơn trên máy tính của bạn nhưng không phải với bất kỳ ai khác, đó có thể là do hồ sơ của bạn. Rất nhiều profilers không bình đẳng phạt mã mà họ không thể poke xung quanh trong. –