程序执行中的Fast Path

在给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,什么含金量不用说了吧,果然评论都是一针见血!

### 如何运行一个 FastAPI 应用程序 要运行一个基于 FastAPI 的应用程序,可以按照以下方法操作。通常情况下,FastAPI 使用 Uvicorn 或 Gunicorn 来作为 ASGI 服务器来启动应用。 #### 方法一:使用 Uvicorn 启动 Uvicorn 是一种轻量级的 ASGI 服务器,非常适合开发和小型生产环境下的 FastAPI 部署。以下是具体的实现方式: 假设有一个名为 `run.py` 的文件,其中包含了 FastAPI 实现逻辑[^1]: ```python from fastapi import FastAPI app = FastAPI() @app.get("/") def read_root(): return {"message": "Hello World"} ``` 可以通过终端执行以下命令来启动该应用: ```bash uvicorn run:app --reload ``` - 参数解释: - `run:app`: 表示加载 `run.py` 文件中的 `app` 对象。 - `--reload`: 开启热重载模式,在开发阶段非常有用,当代码发生变化时会自动重启服务。 默认情况下,这将在本地主机上启动服务,并监听端口 `8000`。你可以通过浏览器访问 `http://127.0.0.1:8000` 查看返回的结果。 --- #### 方法二:使用 Gunicorn 启动 对于更复杂的生产环境,推荐使用 Gunicorn 结合多个工作进程来提高性能。Gunicorn 可以管理多个 Uvicorn 工作线程,从而提升并发处理能力。 下面是一个典型的 Gunicorn 命令配置[^3]: ```bash gunicorn main:app -b 0.0.0.0:10022 -w 4 -k uvicorn.workers.UvicornWorker --timeout 0 --access-logfile - ``` - 参数解释: - `-b 0.0.0.0:10022`: 绑定 IP 地址和端口号。 - `-w 4`: 设置四个工作进程数(可以根据硬件资源调整)。 - `-k uvicorn.workers.UvicornWorker`: 指定使用的工作者类为 Uvicorn Worker。 - `--timeout 0`: 超时时间设置为无限大。 - `--access-logfile -`: 将日志输出到标准输出流。 此命令适用于多核 CPU 环境下高效运行的应用场景。 --- #### 自定义路径挂载 Gradio 接口 如果需要集成其他工具如 Gradio 到 FastAPI 中,则可参考官方文档中的自定义路径挂载案例: ```python from fastapi import FastAPI import gradio as gr CUSTOM_PATH = "/gradio" app = FastAPI() @app.get("/") def read_main(): return {"message": "This is your main app"} io = gr.Interface(lambda x: "Hello, " + x + "!", "textbox", "textbox") app = gr.mount_gradio_app(app, io, path=CUSTOM_PATH) if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000) ``` 上述脚本允许你在同一进程中同时提供 FastAPI 和 Gradio 功能接口。例如,Gradio 页面可通过 `http://localhost:8000/gradio` 访问。 --- ### 总结 无论是简单的开发测试还是复杂的大规模部署,都可以借助不同的工具灵活地运行 FastAPI 应用。在实际项目中,还需要考虑安全性、负载均衡以及监控等因素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值