众所周知,在数字世界中,有很多方法可以完成相同的工作/获得预期的结果。
来自代码的责任/风险由开发人员承担。
这个很小,但是我想是.NET世界中一个非常有用的例子。
因此,许多.NET开发人员在其数据序列化上使用内置的BinaryReader-BinaryWriter来提高性能/对该过程进行控制。
这是FrameWork内置BinaryWriter类的CSharp源代码,其中的重载Write方法之一:
// Writes a boolean to this stream. A single byte is written to the stream
// with the value 0 representing false or the value 1 representing true.
//
public virtual void Write(bool value)
{
//_buffer is a byte array which declared in ctor / init codes of the class
_buffer = ((byte) (value? 1:0));
//OutStream is the stream instance which BinaryWriter Writes the value(s) into it.
OutStream.WriteByte(_buffer[0]);
}
如您所见,该方法无需额外分配_buffer变量即可编写:
public virtual void Write(bool value)
{
OutStream.WriteByte((byte) (value ? 1 : 0));
}
如果不分配,我们将获得几毫秒的时间。这几毫秒可以接受为“几乎没有”,但是如果有成千上万次写入(即在服务器进程中)怎么办?
让我们假设“ few”为2(毫秒),而数千个实例仅为2.000。这意味着处理时间增加了4秒..4秒后返回。
如果我们继续从.NET进行主题学习,并且您可以从MSDN检查BCL的源代码-.NET基础类库-您会发现开发人员的决定会导致很多性能损失。
来自BCL来源的任何观点正常情况下,您会看到开发人员决定使用while()或foreach()循环,这可以在其代码中实现更快的for()循环。
如此小的收益为我们带来了总体表现
如果我们返回BinaryWriter.Write()方法。
实际上,额外分配给_buffer实现不是开发人员的错误。这完全决定了“保持安全”!
假设我们决定不使用_buffer并决定实现第二种方法。如果我们尝试使用第二种方法通过电线发送数千个字节(即,上载/下载BLOB或CLOB数据),则它通常会失败,因为原因是我们尝试在没有任何检查和控制机制的情况下发送所有数据。当连接丢失时,服务器和客户端都不知道发送的数据是否完成。
如果开发人员决定“保持安全”,那么通常意味着性能成本取决于实施的“保持安全”机制。
但是,如果开发人员决定“冒险,获得性能”,这也不是错。.直到对“风险”编码进行了一些讨论。
还有一个小小的注释:商业库开发人员总是试图保持安全,因为他们不知道代码将在哪里使用。