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_period和time_slice参数微调CPU曲线.
好吧,我有一个与我的第一个答案不同的,可能更好的解决方案.
而不是试图操纵CPU,而是挂钩到任务管理器应用程序,强制它绘制你想要的,而不是CPU结果.接管绘制图形等的GDI对象.排序"作弊",但他们没有说你必须操纵CPU
甚至可以从获取CPU%的任务管理器挂钩调用,而是返回正弦结果.
| 归档时间: |
|
| 查看次数: |
3369 次 |
| 最近记录: |