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
相关产品推荐
相关产品推荐

