gpt4 book ai didi

ruby - 这个 Ruby 和 shell 代码有什么区别?

转载 作者:太空宇宙 更新时间:2023-11-03 16:05:00 26 4
gpt4 key购买 nike

我有一个 shell 脚本以百分比计算 CPU 使用率。因为我想扩展功能,并且想在 Ruby 中执行此操作而不是从 Ruby 调用 shell 脚本。

我尝试用 Ruby 重写代码,但最终输出存在差异。

shell 代码的输出在 5% 到 10% 之间,Ruby 代码的输出在 97.5% 到 97.8% 之间。

这是 Ruby 代码:

result = `cat /proc/stat | grep '^cpu '`.split(" ")
result.delete("cpu")
idle_time0 = result[4].to_i
total_time0 = 0

result.each do |partial_time|
total_time0 += partial_time.to_i
end


sleep 0.5


result = `cat /proc/stat | grep '^cpu '`.split(" ")
result.delete("cpu")
idle_time = result[4].to_i
total_time = 0

result.each do |partial_time|
total_time += partial_time.to_i
end

diff_idle = idle_time - idle_time0
diff_total = total_time - total_time0

diff_usage = (1000*(diff_total - diff_idle)/(diff_total+5).to_f)/10.0

p diff_usage

这是 shell 脚本:

#!/bin/bash

CPU=(`cat /proc/stat | grep '^cpu '`) # Get the total CPU statistics.
unset CPU[0] # Discard the "cpu" prefix.
IDLE=${CPU[4]} # Get the idle CPU time.

# Calculate the total CPU time.
TOTAL=0
for VALUE in "${CPU[@]}"; do
let "TOTAL=$TOTAL+$VALUE"
done

# Remember the total and idle CPU times for the next check.
PREV_TOTAL="$TOTAL"
PREV_IDLE="$IDLE"

# Wait before checking again.
sleep 0.5

CPU=(`cat /proc/stat | grep '^cpu '`) # Get the total CPU statistics.
unset CPU[0] # Discard the "cpu" prefix.
IDLE=${CPU[4]} # Get the idle CPU time.

# Calculate the total CPU time.
TOTAL=0
for VALUE in "${CPU[@]}"; do
let "TOTAL=$TOTAL+$VALUE"
done

# Calculate the CPU usage since we last checked.
let "DIFF_IDLE=$IDLE-$PREV_IDLE"
let "DIFF_TOTAL=$TOTAL-$PREV_TOTAL"
let "DIFF_USAGE=(1000*($DIFF_TOTAL-$DIFF_IDLE)/$DIFF_TOTAL+5)/10"

echo -en "\rCPU: $DIFF_USAGE% \b\b"

最佳答案

ProGNOMmers 已经指出了您的索引错误,但我想指出,像您所做的那样转换为 ruby​​ 几乎没有任何好处。您的 ruby​​ 代码读起来和 bash 一样难看,您仍然要花两次钱来获取 /proc/stat。通过使用 ruby​​ 作为高级语言,您可以使它更具可读性、更不容易出错并且更高效。

这是重写的示例。我做了一个小方法将/proc/stat 行转换为具有有意义名称的结构,因此不会再出现数组索引问题,并且始终清楚您引用的是哪个计时器值。我用过 File::readlinesEnumerable#grep读取 proc 文件系统而不必掏空。我使用 printf 格式化来获得您似乎正在寻找的百分位数舍入效果。

#!/usr/bin/env ruby

# http://man7.org/linux/man-pages/man5/proc.5.html
CpuTimes = Struct.new :user, :nice, :system, :idle, :iowait, :irq,
:softirq, :steal, :guest, :guest_nice, :total

def get_cpu_times
parts = File.readlines('/proc/stat').grep(/^cpu /).first.split
times = parts[1..-1].map(&:to_i)
CpuTimes[ *times ].tap { |r| r[:total] = times.reduce(:+) }
end

c0 = get_cpu_times
sleep 0.5
c1 = get_cpu_times

idle = c1.idle - c0.idle
total = c1.total - c0.total
usage = total - idle
printf "CPU: %.1f%%", 100.0 * usage / total

关于ruby - 这个 Ruby 和 shell 代码有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15952833/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com