在给Garnet贡献代码的时候,第一次遇到了这种情况,记录一下,之前只见过基本的理论。
在程序执行中,”fast path” 是指在代码中经常执行的、性能较高的、不涉及额外处理或条件分支的代码路径。这个术语通常用于区分程序中相对较慢或不太频繁执行的代码路径。
“fast path” 通常是指程序中的主要执行路径,它通常包含了一系列简单、高效的操作,而且不需要进行额外的错误处理、边界检查或复杂的逻辑判断。由于这些操作的简单性和高效性,”fast path” 执行路径通常能够以较低的延迟和较高的吞吐量执行,从而提高程序的整体性能。
在编程中,开发人员经常会优化”fast path”,以确保它能够尽可能地快速执行。这可能涉及到使用更有效的算法、数据结构或编程技巧,以减少不必要的计算、内存访问或其他资源消耗。通过优化”fast path”,可以提高程序的响应速度和整体性能。
相关PR: https://github.com/microsoft/garnet/pull/278
本质上就是快速判断一个字符串是等于LEFT还是RIGHT,但是可能会出现大小写混合的情况。我上来二话不说给人家全转成大写了。 但是程序执行的大多数情况都是正常的case,无论是否正常,我都给人家转了,但是大多数情况其实是不用转的。所以我这就显得多此一举了。
我写的代码:
public OperationDirection GetOperationDirection(ArgSlice input)
{
#if NET8_0_OR_GREATER
if (Ascii.EqualsIgnoreCase(input.ReadOnlySpan, "RIGHT"))
{
return OperationDirection.Right;
}
else if (Ascii.EqualsIgnoreCase(input.ReadOnlySpan, "LEFT"))
{
return OperationDirection.Left;
}
#else
// Optimize for the common case
if (input.ReadOnlySpan.SequenceEqual("LEFT"u8))
return OperationDirection.Left;
if (input.ReadOnlySpan.SequenceEqual("RIGHT"u8))
return OperationDirection.Right;
// Rare case: try making upper case and retry
MakeUpperCase(input.ptr);
if (input.ReadOnlySpan.SequenceEqual("LEFT"u8))
return OperationDirection.Left;
if (input.ReadOnlySpan.SequenceEqual("RIGHT"u8))
return OperationDirection.Right;
#endif
return OperationDirection.Unknown;
}
按照建议后优化之后的代码:
/// <summary>
/// Tries to parse the input as "LEFT" or "RIGHT" and returns the corresponding OperationDirection.
/// If parsing fails, returns OperationDirection.Unknown.
/// </summary>
/// <param name="input">The input to parse.</param>
/// <returns>The parsed OperationDirection, or OperationDirection.Unknown if parsing fails.</returns>
public OperationDirection GetOperationDirection(ArgSlice input)
{
// Optimize for the common case
if (input.ReadOnlySpan.SequenceEqual("LEFT"u8))
return OperationDirection.Left;
if (input.ReadOnlySpan.SequenceEqual("RIGHT"u8))
return OperationDirection.Right;
// Rare case: try making upper case and retry
MakeUpperCase(input.ptr);
if (input.ReadOnlySpan.SequenceEqual("LEFT"u8))
return OperationDirection.Left;
if (input.ReadOnlySpan.SequenceEqual("RIGHT"u8))
return OperationDirection.Right;
return OperationDirection.Unknown;
}
另,给我review代码的人竟然是微软的Partner Researcher,做系统的谷歌学术引用3600,什么含金量不用说了吧,果然评论都是一针见血!
文档信息
- 本文作者:Zzhiter
- 本文链接:http://zzhiter.top/2024/04/16/%E7%A8%8B%E5%BA%8F%E6%89%A7%E8%A1%8C%E4%B8%AD%E7%9A%84Fast-Path/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)