aardio 官方社区

用户名  找回密码
 注册会员

QQ登录

只需一步,快速开始

帖子
查看: 9929|回复: 5

获取当前程序占用的内存和cpu

[复制链接]

47

主题

131

回帖

1167

积分

荣誉会员

积分
1167
发表于 2012-8-10 13:02:13 来自手机 | 显示全部楼层 |阅读模式
如题,因为想根据系统当前CPU消耗情况去调整线程数量,但是不知道如何去实现。翻阅了下开发文档winapi ,但是没有找到CPU对应的资料。

1

主题

42

回帖

1173

积分

四级会员

积分
1173
发表于 2012-8-10 18:00:19 | 显示全部楼层
import com

import console

var objWMIService = com.GetObject("winmgmts:\\.\root\cimv2")
var colItems = objWMIService.ExecQuery("SELECT * FROM Win32_PerfFormattedData_PerfProc_Process")

for i,objItem in com.each(colItems) {
    console.log(objItem.getName(), objItem.getPercentProcessorTime(), objItem.getPrivateBytes())
}

execute("pause")







Some gotchas
当前程序占用的内存
PrivateBytes指的是current number of bytes this process has allocated that cannot be shared with other processes,其他还有WorkingSetWorkingSetPeakVirtualBytesVirtualBytesPeak......,各有不同意思。
当前程序占用的CPU
The values via directly reading PercentProcessorTime, PercentPrivilegedTime, or PercentUserTime may be not what you want. Please refer to
http://blogs.technet.com/b/heyscriptingguy/archive/2005/04/21/why-does-my-performance-monitoring-script-keep-returning-the-same-incorrect-values.aspx

42

主题

628

回帖

3765

积分

版主

积分
3765
发表于 2012-8-10 19:56:47 | 显示全部楼层
carl 2010年的贴子
读取进程中程序使用内存大小
http://bbs.aardio.com/thread-410-1-1.html

import process

GetProcessMemoryInfo = ::Psapi.api(
"GetProcessMemoryInfo","int(pointer hProcess,struct& ppsmemCounters,int cb)")

PROCESS_MEMORY_COUNTERS =
class{
    int cb;
    int PageFaultCount;
    int PeakWorkingSetSize;
//物理内存的最大值
    int WorkingSetSize;     //物理内存的大小
    int QuotaPeakPagedPoolUsage;
    int QuotaPagedPoolUsage;
    int QuotaPeakNonPagedPoolUsage;
    int QuotaNonPagedPoolUsage;
    int PagefileUsage;      
//虚拟内存大小
    int PeakPagefileUsage;  //虚拟内存的最大值
}

mem = PROCESS_MEMORY_COUNTERS()

import console
for processEntry in process.each( ".*.exe" ) {  
     prc=process(processEntry.th32ProcessID)
     GetProcessMemoryInfo(prc.handle,mem,raw.sizeof(mem))
     console.log(processEntry.szExeFile +
" 内存使用:",mem.WorkingSetSize/1024 ++ "K")
}

26

主题

76

回帖

649

积分

荣誉会员

积分
649
发表于 2012-8-10 20:26:57 | 显示全部楼层
cpu的以前找了个c版本的翻译了下,有几个地方自己也没弄懂,不知道对不对
import console;
import sys.info;
import fsys.time;

GetProcessTimes = ::Kernel32.api(
"GetProcessTimes","int(int hProcess,struct& lpCreationTime,struct& lpExitTime,struct& lpKernelTime,struct& lpUserTime)")
GetCurrentProcess = ::Kernel32.api(
"GetCurrentProcess","int()")

//获取cpu 数目
get_processor_number = function(){
   
var info = sys.info();
   
return info.dwNumberOfProcessors;
}

var processor_count = -1;
var last_t = 0;
var last_system_t = 0;

//获取cpu占用率
get_cpu_usage = function(){
   
var now = fsys.time();
   
var creation_time = fsys.time();
   
var exit_time = fsys.time();
   
var kernel_time = fsys.time();
   
var user_time = fsys.time();
   
   
if(processor_count == -1)
    {
        processor_count = get_processor_number();
    }
   
    now.fromSystemTime();
   
if( !GetProcessTimes( GetCurrentProcess(), creation_time, exit_time, kernel_time, user_time ) ){
        
// We dont assert here because in some cases (such as in the TaskManager)
        // we may call this function on a process that has just exited but we have
        // not yet received the notification.
        return -1;
    }
   
   
var system_t = ( tonumber(kernel_time) +  tonumber(user_time) ) / processor_count;
   
var t = tonumber(now);
   
   
if ((last_system_t == 0) || (last_t == 0))  {
        
// First call, just set the last values.
        last_system_t = system_t;
        last_t = t;
        
return -1;
    }
   
   
var system_t_delta = system_t - last_system_t;
   
var t_delta = t - last_t;
   
assert(t_delta, "程序运行时间为0");
   
// We add time_delta / 2 so the result is rounded.
    var cpu = ((system_t_delta * 100 + t_delta / 2) / t_delta);
    last_t = t;
    last_system_t = system_t;
   
   
return cpu;
}

var i = 5;
do{
   
var cpu = get_cpu_usage();
    console.log( string.format(
"CPU使用率%.2f%%",cpu))
   
sleep(1000)
    i--;
}
while(i)
console.pause();
console.close()

47

主题

131

回帖

1167

积分

荣誉会员

积分
1167
 楼主| 发表于 2012-8-10 20:29:58 | 显示全部楼层
proteus 发表于 2012-8-10 18:00
import com

import console

谢谢你的回复,不过没有找到CPU相关内容。。。亦或者是我没有看明白

47

主题

131

回帖

1167

积分

荣誉会员

积分
1167
 楼主| 发表于 2012-8-12 22:02:00 | 显示全部楼层
编程 发表于 2012-8-10 19:56
carl 2010年的贴子
读取进程中程序使用内存大小
http://bbs.aardio.com/thread-410-1-1.html

谢谢你
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|aardio.com|aardio 官方社区 ( 皖ICP备09012014号 )

GMT+8, 2025-6-15 21:51 , Processed in 0.087890 second(s), 23 queries .

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表