在你对肠道作出反应之前,正如我最初所做的那样,请阅读整个问题.我知道他们让你感觉很脏,我知道我们以前都被烧过,我知道这不是"好风格",但公共场地还好吗?
我正在研究一个相当大规模的工程应用程序,它创建并使用结构的内存模型(从高层建筑到桥梁到棚子,无关紧要).该项目涉及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[] …Run Code Online (Sandbox Code Playgroud) 我有一个看似非常简单的情况,我在.NET Framework的3.5版本中使用System.Threading.ReaderWriterLockSlim.我首先声明一个,如下所示:
锁定声明http://odeh.temp.s3.amazonaws.com/lock_declaration.bmp
我在获得锁定之前设置了一个断点并拍摄了一个屏幕截图,以便您可以看到(在监视窗口中)当前没有锁定:
预锁获取http://odeh.temp.s3.amazonaws.com/prelock.bmp
然后,在调用EnterWriteLock后,您可以看到我正在按住Read Lock.
锁定后收购http://odeh.temp.s3.amazonaws.com/postlock.bmp
这似乎是真正意想不到的行为,我无法在任何地方找到它.有没有人知道为什么会这样?在我的代码中的其他地方(前面),这个完全相同的代码行正确地获得了写锁定.然而,在多个系统中,它始终在调用堆栈中的这个位置获得读锁定.希望我已经明确表示,并感谢您抽出时间来研究这个问题.
---编辑---
那些提到断言的人......这让我更加困惑:
断言http://odeh.temp.s3.amazonaws.com/assert.bmp
我真的不能说它是如何通过这个断言,除了可能Watch Window和Immediate窗口是错误的(也许值是本地存储线程,如另一张海报所提到的).对于一个易变量和一个Happens Before关系来说,这似乎是一个明显的例子.无论哪种方式,之后的几行都有代码,这些代码为写锁定而没有一个.我已经在整个程序中的唯一一行代码中设置了一个断点,它释放了这个锁,并且在这里显示的获取之后它没有被调用,所以这必然意味着它从未实际获得过......对吗?