Windows中一些关于CPU\系统效能的知识——编程之美1.1

本文介绍Windows系统中性能监控工具Perfmon及其使用方法,同时列举了多个API函数,如Sleep、WaitForSingleObject等,用于实现线程调度与性能测量。还介绍了Microsoft .NET Framework提供的PerformanceCounter对象来获取系统性能数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Perfmon是从Windows NT开始就包含在Windows管理工具组中的专业检测工具之一,可获取有关操作系统、应用程序和硬件的各种效能计数器(perf counter)。perfmon的用法相当直接,只要选择检测的对象(如处理器、RAM或硬盘),然后选择效能计数器(比如监视物理磁盘的平均队列长度);

Micorsoft .NETFramework提供了PerformanceCounter这一对象,可以方便地得到当前各种性能数据,包括CPU的使用率;

几个API函数

1、void Sleep(DWORD dwMilliseconds);使调用线程暂停自己的运行,直到指定的时间间隔过去为止;

2、DWORD WaitForSingleObject(HANDLEhHandle,DWORD dwMilliseconds);

    hHandle:所请求对象的句柄。如果该对象处于无信号状态,即未通知的状态,则该函数就会一直等待,这样就暂停线程的执行;

    dwMilliseconds:指定等待的时间间隔,以毫秒为单位。如果指定的时间间隔已过,即使所请求的对象仍处于无信号状态,WaitForSingleObject函数也会返回;

3、DWORDGetTickCount(void);操作系统启动到当前所经过的毫秒数,常常用来判断某个方法执行的时间,并非实时发送,而是由系统每18ms发送一 次,因此其最小精度为18ms;

4、BOOLQueryPerformanceFrequency(LARGE_INTEGER *lpFrequency)/BOOLQueryPerformanceCounter (LARGE_INTEGER *lpCount):要求计算机从硬件上支持高精度定时器,定时前应该先调用QueryPerformanceFrequency()函数获得机器内部计时器的时钟频率。接着在需要严格计时的事件发生前和发生之后分别调用QueryPerformanceCounter(),利用两次获得的计数之差和时钟频率,就可以计算出事件经历的精确时间;

5、timeGetSystemTime():函数返回系统时间,(毫秒)。这里的系统时间是指自从系统启动时到调用该函数时的时间间隔;

6、PerformanceCounter——Microsoft .NET Framework 提供的对象,可以方便得得到当前各种性能数据,包括CPU的使用率;

7、GetProcessorInfo()/SetThreadAffinityMask():GetProcessorInfo()获得多处理器的信息,SetThreadAffinityMask()指定进程在哪一个处理器上运行;

8、GetCPUTickCount():不过现代计算机CPU的频率会随着负载而变化,所以没大有必要使用该函数,使用getTickCount就足够了

X86平台定义函数(RDTDC指令后去当前CPU核心运行周期数):

inline _int64 GetCPUTickCount()

{

      _asm

     {

           rdtsc;

     }

}

在X64平台上定义:

#define  GetCPUTickCount() _rdtsc()

 

 

import cv2 as cv import numpy as np def access_pixels(image): #image.shape输出了image的三维数据:高,宽,通道 print(image.shape) height = image.shape[0] width = image.shape[1] channels = image.shape[2] print("height :%s, width :%s,channels : %s" %(width,height,channels)) for row in range(height): #从0到height循环 类比于for(int row =0; row<height;row++) for col in range(width): for c in range(channels): pv = image[row,col,c]#获取位于[row,col,c]坐标的像素值 image[row,col,c] = 255 -pv cv.imshow("1",image) def creat_image(): """"" #建立多通道数组 #zeros(shape, dtype=float, order='C') #依据给定形状和类型(shape, dtype, order])返回一个新的元素全部为0的数组(类比np.ones())。 #参数一:形状(即[row,col,channels]) #参数二:数据类型(默认是np.float64) img = np.zeros([400,400,3],np.uint8) #这个输出的应该是400个400*3矩阵(400行400列每列3通道矩阵) #ones(shape,dtype):依据给定形状和类型(shape,dtype),返回一个新的元素全部为1的数据 举个例子:print np.ones((4,5,3),dtype=np.uint8) 输出的是4(height)个5(width)X3(channel)矩阵,且所有元素为1 [ [1,1,1] [1,1,1] [1,1,1] [1,1,1] [1,1,1] [1,1,1] [1,1,1] [1,1,1] [1,1,1] [1,1,1] [1,1,1] [1,1,1] [1,1,1] [1,1,1] [1,1,1] [1,1,1] [1,1,1] [1,1,1] [1,1,1] [1,1,1] ] #该句话的意思就是令img的第2通道(G通道)赋值为255 img[:,:, 2] =np.ones([400, 400])*255 cv.imshow("2",img) """"" #建立单通道数组 img = np.zeros([400,400,1],np.uint8) #img[:,:,0] = np.ones([400,400])*127 #对于单通道 也可以这么做,也就是单通道矩阵像素*127 ;但是如果是多通道,则是三通道矩阵 # 的像素*127 #img = img*127 与img.fill(127)作用是一样的 img.fill(127) cv.imshow("3",img) # cv.imwrite("E:/opencv/picture/img111.jpg",img) src = cv.imread("E:/opencv/picture/test1.jpg") cv.imshow("window",src) t1 = cv.getCPUTickCount()#cv.getCPUTickCount 获取当前cpu到该位置所用的时间的总数 creat_image() t2 = cv.getCPUTickCount() time = (t2-t1)/cv.getTickFrequency()#计算得到creat_image()所用的时间(单位是us) print("time : %s ms"%(time*1000)) cv.waitKey(0) 小结: 1. image.shape 得到image的外形尺寸:height,width,channel,其中image[0]是height, image[1]是width,, image[2]是channel 2. 逐个像素点改变像素值 利用三个for嵌套 3. 创建image的两种方法: np.zeros(shape, dtype=float, order='C') np.ones(shape,dtype) 当然也可以建立一个数组: hsv = np.array([20,30,33]) 建立了一个3维数组 4. 给图片的某个通道赋值: img[;,;,2] =np.ones([400,400])*255 补充: 我们利用access_pixel修改像素耗时太长了,这显然是我们不想看到的。下面用一句api指令就可以替代我们defination def inverse(image): dst = cv.bitwise_not(image) cv.imshow("4",dst) cv.bitwise_not(src) : 是对二进制数据进行“非”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“非”操作,~1=0,~0=1 然后我们再计算时间就会发现节省了很多时间。 5. 计算某段代码所用时间 t1 = cv.getCPUTickCount() api指令。。。 t2 = cv.getCPUTickCount() time = (t2-t1)/cv.getTickFrequency()#计算得到
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值