我编写了一个C++库来完成一些非常繁重的CPU工作(所有这些都是数学和计算),如果留给它自己的设备,将很容易消耗100%的所有可用CPU资源(它也是多线程的可用逻辑数量)机器上的核心).
因此,我在主计算循环中有一个回调,使用该库的软件应该调用:
while(true)
{
//do math here
callback(percent_complete);
}
Run Code Online (Sandbox Code Playgroud)
在回调中,客户端调用Sleep(x)来减慢线程.
最初,客户端代码是一个固定的Sleep(100)调用,但这会导致糟糕的不可靠性能,因为有些机器比其他机器更快地完成数学运算,但所有机器上的睡眠都是相同的.所以现在客户端检查系统时间,如果超过1秒(= =几次迭代),它将休眠半秒钟.
这是减慢线程的可接受方式吗?我应该使用信号量/互斥量而不是Sleep()来最大化性能吗?每1秒处理工作正在睡觉x毫秒,还是有什么不对的,我没有注意到?
我问的原因是,即使taskman显示该进程占用了大约10%的CPU,机器仍然会严重陷入困境.我已经探讨过硬盘和内存争用无济于事,所以现在我想知道我放慢线程的方式是否导致了这个问题.
谢谢!
我想知道mashable.com上图像的淡入效果(例如http://mashable.com/2009/08/14/google-android-logo-remixes/)
当您滚动到图像时,它会淡入.它不会在页面加载时消失,只会在屏幕上项目的实际外观上消失.
谢谢.
我在Windows中使用CreateRemoteThread,想知道Linux中是否可以使用相同的东西.是否可以在Linux中执行此操作?
我正在做Visual C++编程,我已经创建了一个CLR控制台应用程序.我注意到String数组应该声明为String ^,而不是String [].有什么用?^ 为什么要用它代替[]?这种替代仅限于CLR应用吗?这是一行代码和错误:
array<String[]>[] abc;
Run Code Online (Sandbox Code Playgroud)
产生的错误是
错误C2143:语法错误:缺少';' 在'['之前
错误C2146:语法错误:缺少';' 在标识符'abc'之前
eror C2065:'abc':未声明的标识符
让我们假设您有一个函数返回一个延迟枚举的对象:
struct AnimalCount
{
int Chickens;
int Goats;
}
IEnumerable<AnimalCount> FarmsInEachPen()
{
....
yield new AnimalCount(x, y);
....
}
Run Code Online (Sandbox Code Playgroud)
您还有两个消耗两个独立IEnumerables的函数,例如:
ConsumeChicken(IEnumerable<int>);
ConsumeGoat(IEnumerable<int>);
Run Code Online (Sandbox Code Playgroud)
如何调用ConsumeChicken和ConsumeGoat不FarmsInEachPen()预先转换ToList()因为它可能有两个zillion记录,b)没有多线程.
基本上:
ConsumeChicken(FarmsInEachPen().Select(x => x.Chickens));
ConsumeGoats(FarmsInEachPen().Select(x => x.Goats));
Run Code Online (Sandbox Code Playgroud)
但是没有强制双重枚举.
我可以使用多线程来解决它,但是每个列表的缓冲队列都会变得不必要地复杂化.
所以我正在寻找一种方法将AnimalCount枚举器分成两个int枚举器而不进行全面评估AnimalCount.在锁定步骤中一起运行ConsumeGoat并没有问题ConsumeChicken.
我可以感觉到解决方案,但我并不完全在那里.我正在考虑一个辅助函数,它返回一个IEnumerable被输入的函数,ConsumeChicken每次使用迭代器时,它在内部调用ConsumeGoat,从而在锁步中执行这两个函数.当然,除了我不想ConsumeGoat多次打电话..
是否有一种首选的方法,可以部分还原未暂存的更改(git checkout -p)和部分添加未暂存的更改(git add -p)来还原先前提交的一部分?
也就是说,我有一个提交(包含多个所需更改和不想要的更改)的多个(或什至很多个)提交,我想选择性地还原其中一些更改,同时保留其他更改。
我当前的工作流程不好玩:
git diff commit commit^ > selective.diff
cp selective.diff selective2.diff
nvim selective2.diff
# change unwanted - to ' ' and remove unwanted +, then save
rediff selective.diff selective2.diff | rewrite selective2.diff
git apply selective2.diff
Run Code Online (Sandbox Code Playgroud)
并祈祷补丁需要
我有一个程序,一次加载一个文件(从10MB到5GB)一个块(ReadFile),并为每个块执行一组数学运算(基本上计算哈希).
在计算散列之后,它将关于块的信息存储在STL映射中(基本上<chunkID, hash>),然后将块本身写入另一个文件(WriteFile).
就是这样.该程序将导致某些PC窒息死亡.鼠标开始断断续续,任务管理器需要> 2分钟显示,ctrl + alt + del无响应,运行程序很慢......工作.
我已经完成了我能想到的优化程序的所有内容,并对所有对象进行了三重检查.
我做了什么:
即使在所有这些之后,应用程序仍然会在某些情况下导致系统范围内的某些机器挂起.
Perfmon和Process Explorer显示最小的CPU使用率(使用休眠),没有来自磁盘的持续读/写,几个硬页面故障(在5GB输入文件的应用程序的生命周期中只有~30k页面故障),虚拟内存很少(从不超过150MB),没有泄漏的手柄,没有内存泄漏.
我在运行Windows XP时测试过的机器 - 包括Windows 7,x86和x64版本.没有少于2GB的RAM,尽管在较低的内存条件下问题总是会加剧.
我不知道下一步该做什么.我不知道是什么导致它 - 我在CPU或内存之间被撕裂是罪魁祸首.CPU因为没有睡眠和不同的线程优先级,系统性能会发生显着变化.内存,因为使用unordered_set与Google的dense_hash_map时,问题发生的频率存在巨大差异.
有什么奇怪的?显然,NT内核的设计应该防止这种行为的不断发生(用户模式应用驱动系统,这种极端的表现不佳!?)......但是当我编译和运行代码在OS X或Linux上(它是相当标准的C++),即使在内存较少且CPU较弱的糟糕机器上也能表现出色.
接下来我应该做什么?我怎么知道Windows在杀死系统性能的幕后所做的是什么,当所有指标都是应用程序本身没有做任何极端的事情时?
任何建议都是最受欢迎的.
我有以下查询,它做了我想要的,但我怀疑没有子查询可以这样做:
SELECT *
FROM (SELECT *
FROM 'versions'
ORDER BY 'ID' DESC) AS X
GROUP BY 'program'
Run Code Online (Sandbox Code Playgroud)
我需要的是按程序分组,但返回具有最高值"ID"的版本中的对象的结果.
在我过去的经验中,像这样的查询应该在MySQL中工作,但由于某种原因,它不是:
SELECT *
FROM 'versions'
GROUP BY 'program'
ORDER BY MAX('ID') DESC
Run Code Online (Sandbox Code Playgroud)
我想要做的是让MySQL首先执行ORDER BY 然后再执行GROUP BY,但它坚持首先执行GROUP BY,然后执行ORDER BY.即它正在对分组的结果进行排序,而不是对排序的结果进行分组.
当然不可能写
SELECT * FROM 'versions' ORDER BY 'ID' DESC GROUP BY 'program'
谢谢.
我在Visual Studio 2012中创建了一个新的C++/CLI项目,并在项目创建页面上选择了.NET 2.0作为框架.我已验证"外部依赖项"(mscorlib.dll,System.Data.dll,System.dll和System.XML.dll)显示"路径" c:\Windows\Microsoft.NET\Framework\v2.0.50727\*.
在同一解决方案中从C#.NET 2.0项目添加对此项目的引用时,在构建时,编译器无法链接到我的C++库,并出现以下错误:
警告2无法解析主要参考"D:\ GIT\EasyBCD\Release\Win32Interop.dll",因为它对.NET Framework程序集具有间接依赖性"mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089"其当前目标框架中的版本"4.0.0.0"高于版本"2.0.0.0".C:\ Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.Targets 1578
但是,就像我说的那样,'Win32Interop'项目中的引用清楚地表明使用了v2.0,并且项目文件本身包含<TargetFrameworkVersion>v2.0</TargetFrameworkVersion>它应该包含的内容.
为什么Visual Studio 2012给了我这么难的时间?
编辑
神秘感加深了.尝试删除所有,然后在C++/CLI项目中重新添加.NET引用时,显示如下:

如您所见,顶部显示"Targeting:.NET Framework 2.0"和"Version"列表示我选择版本"2.0.0.0".
但是,单击"确定"后,这就是引用列表的样子:

Targeted框架仍为".NETFramework,Version = v2.0",但各个引用均表示正在使用版本"4.0.0.0"(以及该版本文件的公钥标记).
然而,选择每个引用时的属性对话框绝对保持正在使用v2.0文件.谁相信?该怎么办?
.net interop c++-cli .net-framework-version visual-studio-2012
根据C++规范(23.2.4.3),vector :: erase()只会使"擦除点之后的所有迭代器和引用"无效"
这样,在采用reverse_iterators时越过所有向量成员,在当前迭代器的擦除应该不引起撕裂()成员将被无效.
此代码将在G ++下运行,但会在Windows上提供运行时异常(VS2010):
#include <vector>
using namespace std;
int main()
{
vector<int> x;
x.push_back(1);
x.push_back(2);
x.push_back(3);
//Print
for(vector<int>::const_iterator i = x.begin(); i != x.end(); ++i)
printf("%d\n", *i);
//Delete second node
for(vector<int>::reverse_iterator r = x.rbegin(); r != x.rend(); ++r)
if(*r == 2)
x.erase((r+1).base());
//Print
for(vector<int>::const_iterator i = x.begin(); i != x.end(); ++i)
printf("%d\n", *i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
错误很有趣:
表达式:向量迭代器不可递减
在第二次运行时给出第二个for循环的行.递减引用reverse_iterator的内部"当前"迭代器成员,每当reverse_iterator递增时递减.
有人能解释一下这种行为吗?
谢谢.
编辑
我认为这个代码示例更好地表明它不是r的问题,而是rend():
//Delete second node
for(vector<int>::reverse_iterator r = x.rbegin(); r != x.rend();)
{
vector<int>::reverse_iterator …Run Code Online (Sandbox Code Playgroud) c++ ×3
c++-cli ×2
performance ×2
visual-c++ ×2
.net ×1
algorithm ×1
animation ×1
arrays ×1
c# ×1
cpu-usage ×1
effect ×1
enumerator ×1
erase ×1
fade ×1
git ×1
git-revert ×1
group-by ×1
ienumerable ×1
interop ×1
javascript ×1
kernel ×1
linq ×1
linux ×1
mysql ×1
optimization ×1
posix ×1
pthreads ×1
ptrace ×1
sleep ×1
sql ×1
sql-order-by ×1
subquery ×1
vector ×1
windows ×1