编写代码以使CPU使用率显示正弦波

cha*_*gel 25 windows trigonometry cpu-usage

用您喜欢的语言编写代码,让Windows任务管理器代表CPU使用历史中的正弦波.

这是来自微软中国的技术访谈测验.我认为这是一个很好的问题.特别值得了解候选人如何理解并找出解决方案.

编辑:如果可能涉及多核(cpu)案例,这是一个好点.

flo*_*din 15

Windows中的线程时间片是40ms,即iirc,因此这可能是一个很好的数字,可用作100%标记.

unsigned const TIME_SLICE = 40;
float const PI = 3.14159265358979323846f;
while(true)
{
    for(unsigned x=0; x!=360; ++x)
    {
        float t = sin(static_cast<float>(x)/180*PI)*0.5f + 0.5f;
        DWORD busy_time = static_cast<DWORD>(t*TIME_SLICE);
        DWORD wait_start = GetTickCount();
        while(GetTickCount() - wait_start < busy_time)
        {
        }
        Sleep(TIME_SLICE - busy_time);    
    }
}
Run Code Online (Sandbox Code Playgroud)

这将给出大约14秒的时间段.显然,这假设系统中没有其他重要的CPU使用,并且您只在单个CPU上运行它.这些都不是真的那么普遍.


jfs*_*jfs 10

这是在Python中略微修改的@ flodin解决方案:

#!/usr/bin/env python
import itertools, math, time, sys

time_period = float(sys.argv[1]) if len(sys.argv) > 1 else 30   # seconds
time_slice  = float(sys.argv[2]) if len(sys.argv) > 2 else 0.04 # seconds

N = int(time_period / time_slice)
for i in itertools.cycle(range(N)):
    busy_time = time_slice / 2 * (math.sin(2*math.pi*i/N) + 1)
    t = time.clock() + busy_time
    while t > time.clock():
        pass
    time.sleep(time_slice - busy_time);    
Run Code Online (Sandbox Code Playgroud)

可以使用time_periodtime_slice参数微调CPU曲线.


Nei*_*l N 7

好吧,我有一个与我的第一个答案不同的,可能更好的解决方案.

而不是试图操纵CPU,而是挂钩到任务管理器应用程序,强制它绘制你想要的,而不是CPU结果.接管绘制图形等的GDI对象.排序"作弊",但他们没有说你必须操纵CPU

甚至可以从获取CPU%的任务管理器挂钩调用,而是返回正弦结果.

  • 这说明了不良要求(太笼统,解释空间)和强烈要求(具体和具体)之间的差异.并且......在盒子里和开箱即用之间思考的区别. (7认同)