我想知道某个函数在我的C++程序中执行多长时间才能在Linux上执行.之后,我想进行速度比较.我看到了几个时间功能,但结果来自于boost.计时:
process_user_cpu_clock, captures user-CPU time spent by the current process
Run Code Online (Sandbox Code Playgroud)
现在,我不清楚我是否使用上述功能,我将获得CPU花在该功能上的唯一时间吗?
其次,我找不到任何使用上述功能的例子.任何人都可以帮我如何使用上述功能?
PS:现在,我std::chrono::system_clock::now()用来在几秒钟内获得时间,但由于每次CPU负载不同,这给了我不同的结果.
摘要:
我正在寻找最快的计算方法
(int) x / (int) y
Run Code Online (Sandbox Code Playgroud)
没有得到例外y==0.相反,我只想要一个任意的结果.
背景:
在编码图像处理算法时,我经常需要除以(累积的)α值.最简单的变体是带有整数运算的普通C代码.我的问题是,我通常得到结果像素的零误差除法alpha==0.然而,这正是结果无关紧要的像素:我不关心像素的颜色值alpha==0.
细节:
我正在寻找类似的东西:
result = (y==0)? 0 : x/y;
Run Code Online (Sandbox Code Playgroud)
要么
result = x / MAX( y, 1 );
Run Code Online (Sandbox Code Playgroud)
x和y是正整数.代码在嵌套循环中执行了很多次,所以我正在寻找一种摆脱条件分支的方法.
当y不超过字节范围时,我对解决方案感到满意
unsigned char kill_zero_table[256] = { 1, 1, 2, 3, 4, 5, 6, 7, [...] 255 };
[...]
result = x / kill_zero_table[y];
Run Code Online (Sandbox Code Playgroud)
但这显然不适用于更大的范围.
我想最后一个问题是:什么是最快的位,将hack改为0到任何其他整数值,同时保持所有其他值不变?
澄清
我不是100%确定分支太贵了.但是,使用了不同的编译器,所以我更喜欢基准测试而几乎没有优化(这确实值得怀疑).
当然,编译器很有用,但是我不能在C中表达"不关心"的结果,因此编译器永远无法使用全范围的优化.
代码应完全兼容C,主要平台是带有gcc&clang和MacOS的Linux 64位.
我创建了两个C程序
计划1
int main()
{
}
Run Code Online (Sandbox Code Playgroud)计划2
int main()
{
//Some Harmless comments
}
Run Code Online (Sandbox Code Playgroud)AFAIK,在编译时,编译器(gcc)应该忽略注释和冗余空白,因此输出必须类似.
但是当我检查输出二进制文件的md5sums时,它们不匹配.我也试图与优化的编译-O3和-Ofast,但他们仍然不匹配.
这里发生了什么?
编辑:确切的命令和md5sums是(t1.c是程序1,t2.c是程序2)
gcc ./t1.c -o aaa
gcc ./t2.c -o bbb
98c1a86e593fd0181383662e68bac22f aaa
c10293cbe6031b13dc6244d01b4d2793 bbb
gcc ./t2.c -Ofast -o bbb
gcc ./t1.c -Ofast -o aaa
2f65a6d5bc9bf1351bdd6919a766fa10 aaa
c0bee139c47183ce62e10c3dbc13c614 bbb
gcc ./t1.c -O3 -o aaa
gcc ./t2.c -O3 -o bbb
564a39d982710b0070bb9349bfc0e2cd aaa
ad89b15e73b26e32026fd0f1dc152cd2 bbb
Run Code Online (Sandbox Code Playgroud)
是的,md5sums匹配多个具有相同标志的编译.
顺便说一句我的系统是gcc (GCC) 5.2.0和Linux 4.2.0-1-MANJARO #1 SMP PREEMPT x86_64 GNU/Linux
以下所有说明都做同样的事情:设置%eax为零.哪种方式最佳(需要最少的机器周期)?
xorl %eax, %eax
mov $0, %eax
andl $0, %eax
Run Code Online (Sandbox Code Playgroud) 我不确定以下代码是否会导致冗余计算,还是特定于编译器?
for (int i = 0; i < strlen(ss); ++i)
{
// blabla
}
Run Code Online (Sandbox Code Playgroud)
strlen()每次i增加时会计算出来吗?
有哪些提示可以减少.NET应用程序的内存使用量?考虑以下简单的C#程序.
class Program
{
static void Main(string[] args)
{
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
在x64的发布模式下编译并在Visual Studio外部运行,任务管理器报告以下内容:
Working Set: 9364k
Private Working Set: 2500k
Commit Size: 17480k
Run Code Online (Sandbox Code Playgroud)
如果它只为x86编译它会好一点:
Working Set: 5888k
Private Working Set: 1280k
Commit Size: 7012k
Run Code Online (Sandbox Code Playgroud)
然后,我尝试了以下程序,它执行相同但尝试在运行时初始化后修剪进程大小:
class Program
{
static void Main(string[] args)
{
minimizeMemory();
Console.ReadLine();
}
private static void minimizeMemory()
{
GC.Collect(GC.MaxGeneration);
GC.WaitForPendingFinalizers();
SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle,
(UIntPtr) 0xFFFFFFFF, (UIntPtr)0xFFFFFFFF);
}
[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool SetProcessWorkingSetSize(IntPtr process,
UIntPtr minimumWorkingSetSize, UIntPtr maximumWorkingSetSize);
}
Run Code Online (Sandbox Code Playgroud)
在Visual Studio外部的 …
所以我试图在Fibonacci序列中尽可能紧凑地写出第n个数:
public uint fibn ( uint N )
{
return (N == 0 || N == 1) ? 1 : fibn(N-1) + fibn(N-2);
}
Run Code Online (Sandbox Code Playgroud)
但我想知道我是否可以通过改变来使其更加紧凑和高效
(N == 0 || N == 1)
Run Code Online (Sandbox Code Playgroud)
进入单一比较.是否有一些奇特的位移操作可以做到这一点?
以下代码适用于Visual Studio 2008,有无优化.但它只适用于没有优化的G ++(O0).
#include <cstdlib>
#include <iostream>
#include <cmath>
double round(double v, double digit)
{
double pow = std::pow(10.0, digit);
double t = v * pow;
//std::cout << "t:" << t << std::endl;
double r = std::floor(t + 0.5);
//std::cout << "r:" << r << std::endl;
return r / pow;
}
int main(int argc, char *argv[])
{
std::cout << round(4.45, 1) << std::endl;
std::cout << round(4.55, 1) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
输出应该是:
4.5
4.6
Run Code Online (Sandbox Code Playgroud)
但是带有优化(O1- O3)的g ++ …
我有一个性能关键的二元决策树,我想把这个问题集中在一行代码上.下面是二叉树迭代器的代码,其中包含针对它运行性能分析的结果.
public ScTreeNode GetNodeForState(int rootIndex, float[] inputs)
{
0.2% ScTreeNode node = RootNodes[rootIndex].TreeNode;
24.6% while (node.BranchData != null)
{
0.2% BranchNodeData b = node.BranchData;
0.5% node = b.Child2;
12.8% if (inputs[b.SplitInputIndex] <= b.SplitValue)
0.8% node = b.Child1;
}
0.4% return node;
}
Run Code Online (Sandbox Code Playgroud)
BranchData是一个字段,而不是属性.我这样做是为了防止它被内联的风险.
BranchNodeData类如下:
public sealed class BranchNodeData
{
/// <summary>
/// The index of the data item in the input array on which we need to split
/// </summary>
internal int SplitInputIndex = 0;
/// <summary>
/// The …Run Code Online (Sandbox Code Playgroud) 这是一个关于如何确定CUDA网格,块和线程大小的问题.这是对此处发布的问题的另一个问题:
在此链接之后,talonmies的答案包含一个代码片段(见下文).我不理解评论"通常由调整和硬件约束选择的值".
我没有找到一个很好的解释或澄清,在CUDA文档中解释了这一点.总之,我的问题是如何在给定以下代码的情况下确定最佳块大小(=线程数):
const int n = 128 * 1024;
int blocksize = 512; // value usually chosen by tuning and hardware constraints
int nblocks = n / nthreads; // value determine by block size and total work
madd<<<nblocks,blocksize>>>mAdd(A,B,C,n);
Run Code Online (Sandbox Code Playgroud)
顺便说一句,我从上面的链接开始我的问题,因为它部分回答了我的第一个问题.如果这不是在Stack Overflow上提问的正确方法,请原谅或建议我.