You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nushell执行时间格式化函数的分支语句优化探讨

优化Nushell自定义执行时间格式化函数tooktime_fmt的两种方案

背景

我在Nushell里写了个自定义执行时间格式化函数tooktime_fmt,需求是只显示非零的时长单位。现有代码能正常工作,但我担心它的内存占用和条件检查开销,于是拟定了两种优化方向:

方向1:预计算所有时间变量

在函数开头一次性算出并存储所有需要的时间变量,避免重复计算,同时让逻辑更清晰:

def tooktime_fmt [exect: int] {
    # 预计算所有时间维度的变量
    let h_passed = $exect / 3600000
    let m_rem = $exect % 3600000
    let m_passed = $m_rem / 60000
    let s_rem = $m_rem % 60000
    let s_passed = $s_rem / 1000
    let ms_rem = $s_rem % 1000

    # 按需拼接非零时长
    let mut result = ""
    if $h_passed > 0 {
        $result = $result + $"($h_passed)h "
    }
    if $m_passed > 0 {
        $result = $result + $"($m_passed)m "
    }
    if $s_passed > 0 {
        $result = $result + $"($s_passed)s "
    }
    if $ms_rem > 0 {
        $result = $result + $"($ms_rem)ms"
    }

    # 处理0ms的特殊情况
    if $result == "" {
        "0ms"
    } else {
        $result | str trim
    }
}

这种方式的核心是把所有计算逻辑前置,每个变量只计算一次,后续只做简单的非零判断,减少重复运算带来的额外开销。

方向2:用辅助函数简化分支逻辑

把“非零值格式化”的重复逻辑封装成辅助函数,消除主函数里大量重复的条件判断,让代码更简洁:

# 辅助函数:仅当输入值大于0时返回带单位的格式化字符串
def fmt_non_zero [value: int, unit: string] {
    if $value > 0 {
        $"($value)($unit) "
    } else {
        ""
    }
}

def tooktime_fmt [exect: int] {
    let h_passed = $exect / 3600000
    let m_rem = $exect % 3600000
    let m_passed = $m_rem / 60000
    let s_rem = $m_rem % 60000
    let s_passed = $s_rem / 1000
    let ms_rem = $s_rem % 1000

    # 拼接所有非零部分并去除多余空格
    let result = (
        (fmt_non_zero $h_passed "h")
        + (fmt_non_zero $m_passed "m")
        + (fmt_non_zero $s_passed "s")
        + (fmt_non_zero $ms_rem "ms")
    ) | str trim

    # 处理全零场景
    if $result == "" {
        "0ms"
    } else {
        $result
    }
}

通过辅助函数统一处理非零判断和格式化,主函数只负责计算时间变量和拼接结果,可读性和可维护性都更强。

注:exect参数来自$env.CMD_DURATION_MS,无需做类型转换或错误检查。

内容的提问来源于stack exchange,提问作者Futman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 07:52:49