我一直在努力优化我的数字程序,并且遇到了一些神秘的问题.我循环执行数千个浮点运算的代码,其中1个调用pow- 然而,该调用占用了5%的时间......这不一定是关键问题,但它很奇怪,所以我想要了解发生了什么.
当我查找缓存未命中时,VS.NET 2010RC的分析器报告几乎所有缓存未命中都发生在std::pow......所以......那是什么?有更快的替代方案吗?我试过了powf,但那只是稍快一点; 它仍然是异常缓存未命中数的原因.
为什么像pow这样的基本功能会导致缓存未命中?
编辑:这不是托管代码. /Oi内在函数已启用,但编译器可以选择忽略它.更换pow(x,y)由exp(y*log(x))具有类似的性能-刚才所有的高速缓存未命中都在日志功能.
有时错误可能导致内存访问冲突异常.
这个异常究竟是如何触发的?幕后有什么机制?
它是否需要来自CPU(从哪个CPU开始?)/从OS(从什么版本开始?)/从编译器(从什么版本开始?)的支持
编辑:
我想要更好地理解的一个特定场景:
以下代码可能会导致访问冲突异常.
TCHAR* czXXX= _T("ABCDEFG");
czXXX[0]= 'A';
Run Code Online (Sandbox Code Playgroud)
我猜czXXX指向一个只读内存块,但究竟发生了什么?
有人告诉我,只要内存大小不是一个大问题,最好使用int而不是字节或短,因为它实际上更容易处理一个int(CPU需要做额外的东西)使用字节和短路).在C#中这是真的吗?
我经常读到,从一个perf的角度看,在汇编指令级别的分支是不好的.但我还没有真正理解为什么会这样.所以为什么?
有了大量的微控制器,甚至不同级别的arduinos提供比上一个更多的功能,是否有一种数学方式或某种方式来了解您需要多少处理能力,只需通过分析,运行您的程序设计为了选择合适的微型?
没有反复试验.即不只是尝试它,如果太慢,购买下一个芯片.
据我所知,汇编程序分为两个代码2)数据.现在,当我们编码时,比如说c\c ++,代码被加载到内存中,然后CPU开始执行代码,一个指令,作为汇编程序.我的问题是:1.c代码存储在哪里?我的意思是,当我在Visual Studio中运行程序时,代码是否加载到其中一个 - 堆,堆栈......?2.所以内存实际上分为堆栈,堆和日期段,但是当CPU执行程序时,作为汇编程序,它们都是1个具有相同数据区的汇编程序或者它们形成在中,比方说2或3个汇编程序从一个跳到另一个?
**让我添加这个问题,也许它会澄清我的意图:当我启动一个C程序时,代码(机器指令)被加载到内存中.所以,这是一个装配程序.但记忆分裂是如何发生的?我的意思是,堆栈,数据段等不同的内存部分如何修改汇编程序?
在C中,有时我们为算术运算转换数据类型,例如:
int a = (int)b + (int)c;
Run Code Online (Sandbox Code Playgroud)
类型转换对CPU有什么影响?类型转换编译成什么指令(x86)?类型转换会损害CPU管道吗?
我有C++代码处理来自一个1800元素阵列的三个连续值.由ICC 14.0编译的代码比MSVC生成的代码慢约68%(1600对2700 CPU周期).我不明白为什么.有人可以帮忙吗?即使我设置英特尔编译器-O3开关,它也不会改变时序.CPU是Ivy Bridge.
#include <iostream>
int main(){
int data[1200];
//Dummy-populate data
for(int y=0; y<1200; y++){
data[y] = y/2 + 7;
}
int counter = 0;
//Just to repeat the test
while(counter < 10000){
int Accum = 0;
long long start = 0;
long long end = 0;
int p = 0;
start = __rdtsc();
while(p < 1200){
unsigned int level1 = data[p];
unsigned int factor = data[p + 1];
Accum += (level1 * factor);
p = p + 2; …Run Code Online (Sandbox Code Playgroud) 我想知道我的java代码消耗了多少指令来执行.我正在寻找一个开始指令计数的api,最后应该返回最终的指令总数
例如:
public static void main()
{
int a=0;
int b=0;
int c=0;
startCountinst();
if(a==b)
{
c++;
}
int n = stopCountinst();
}
Run Code Online (Sandbox Code Playgroud)
最后,n应表示调用后执行的指令总数startCountinst().在java中可以计算指令吗?
我正在使用python的pyglet模块(Windows上的python 3).当我引用pyglet.image中的任何类时,python的CPU使用率会跳起来并且在我退出python之前不会下降.例如:
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
C:\Anaconda3>python.exe
Python 3.4.3 |Anaconda 2.3.0 (64-bit)| (default, Mar 6 2015, 12:06:10) [MSC v.1
600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import pyglet #No problem!
>>> pyglet.image.ImageData #Heavy CPU load until I exit python
<class 'pyglet.image.ImageData'>
Run Code Online (Sandbox Code Playgroud)
这是预期的行为吗?为什么提这个类(甚至没有实例化它)会导致如此高的CPU负载?
我测试的系统:
带有Anaconda python 3.4.3的Windows 7桌面和通过'pip install pyglet'安装的pyglet:高CPU使用率(我的问题)
与Anaconda python 3.4.3相同的Win7桌面,但通过'pip install hg + https://bitbucket.org/pyglet/pyglet ' 安装了pyglet :高CPU使用率.
来自python.org的python …