众所周知,在数字世界中,有很多方法可以做同样的工作/获得预期的结果。
来自代码的责任/风险在开发人员的肩上。
这很小,但我想是 .NET 世界的一个非常有用的例子..
因此,许多 .NET 开发人员在其数据序列化上使用内置的 BinaryReader - BinaryWriter 以提高性能/控制流程。
这是 FrameWork 内置 BinaryWriter 类的 CSharp 源代码,是重载的写入方法之一:
// 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));
}
如果没有分配,我们可以获得几毫秒。这几毫秒可以接受为“几乎没有”但是如果有成千上万的写入(即在服务器进程中)怎么办?
让我们假设“少数”是 2(毫秒),而数千个实例只有 2.000.. 这意味着处理时间增加了 4 秒.. 4 秒后返回..
如果我们继续从 .NET 开始,并且如果您可以从 MSDN 检查 BCL - .NET 基类库 - 的源代码,您会看到开发人员决定的很多性能损失。
来自 BCL 源代码的任何观点 您看到开发人员决定使用 while() 或 foreach() 循环是很正常的,这可以在他们的代码中实现更快的 for() 循环。
这个小小的收益给了我们整体性能。
如果我们返回到 BinaryWriter.Write() 方法..
实际上,额外分配给 _buffer 实现并不是开发人员的错误。这正是决定“保持安全”!
假设我们决定不使用 _buffer 并决定实现第二种方法。如果我们尝试使用第二种方法通过线路发送数千字节(即上传/下载 BLOB 或 CLOB 数据),它通常会失败,因为连接丢失..因为我们尝试在没有任何检查和控制机制的情况下发送所有数据。当连接丢失时,服务器和客户端都不知道发送的数据是否完成。
如果开发人员决定“保持安全”,那么通常这意味着性能成本取决于实施的“保持安全”机制。
但是,如果开发人员决定“冒险,获得性能”,这也不是错误。直到有一些关于“冒险”编码的讨论。
并且作为一个小提示:商业库开发人员总是试图保持安全,因为他们不知道他们的代码将在哪里使用。