Прежде чем вы отреагируете из кишечника, как я и сделал, прочитайте весь вопрос, пожалуйста. Я знаю, что они заставляют вас чувствовать себя грязными, я знаю, что мы все были сожжены раньше, и я знаю, что это не "хороший стиль", но общедоступны ли общественные поля?
Я работаю над довольно масштабным инженерным приложением, которое создает и работает с моделью памяти в структуре (что-нибудь от высотного здания до моста в сарай, не имеет значения). В этом проекте есть TON геометрического анализа и расчета. Чтобы поддержать это, модель состоит из множества крошечных неизменяемых структур только для чтения, чтобы представлять такие вещи, как точки, сегменты линий и т.д. Некоторым значениям этих структур (например, координатам точек) доступны десятки или сотни миллионов раз во время типичного выполнения программы. Из-за сложности моделей и объема вычислений производительность абсолютно критическая.
Я чувствую, что мы делаем все возможное, чтобы оптимизировать наши алгоритмы, тест производительности для определения шеек бутылок, использовать правильные структуры данных и т.д. и т.д. Я не думаю, что это случай преждевременной оптимизации. Эксплуатационные тесты показывают порядок (по крайней мере) повышения производительности при доступе к полям напрямую, а не через свойство объекта. Учитывая эту информацию и тот факт, что мы также можем предоставить ту же информацию, что и свойства для поддержки привязки данных и других ситуаций... это нормально? Помните, читайте только поля в неизменяемых структурах. Может ли кто-нибудь подумать о причине, о которой я буду сожалеть об этом?
Здесь пример тестового приложения:
struct Point {
public Point(double x, double y, double z) {
_x = x;
_y = y;
_z = z;
}
public readonly double _x;
public readonly double _y;
public readonly double _z;
public double X { get { return _x; } }
public double Y { get { return _y; } }
public double Z { get { return _z; } }
}
class Program {
static void Main(string[] args) {
const int loopCount = 10000000;
var point = new Point(12.0, 123.5, 0.123);
var sw = new Stopwatch();
double x, y, z;
double calculatedValue;
sw.Start();
for (int i = 0; i < loopCount; i++) {
x = point._x;
y = point._y;
z = point._z;
calculatedValue = point._x * point._y / point._z;
}
sw.Stop();
double fieldTime = sw.ElapsedMilliseconds;
Console.WriteLine("Direct field access: " + fieldTime);
sw.Reset();
sw.Start();
for (int i = 0; i < loopCount; i++) {
x = point.X;
y = point.Y;
z = point.Z;
calculatedValue = point.X * point.Y / point.Z;
}
sw.Stop();
double propertyTime = sw.ElapsedMilliseconds;
Console.WriteLine("Property access: " + propertyTime);
double totalDiff = propertyTime - fieldTime;
Console.WriteLine("Total difference: " + totalDiff);
double averageDiff = totalDiff / loopCount;
Console.WriteLine("Average difference: " + averageDiff);
Console.ReadLine();
}
}
результат:
Прямой доступ к полям: 3262
Доступ к объекту: 24248
Общая разница: 20986
Средняя разница: 0.00020986
Это всего лишь 21 секунда, но почему бы и нет?