- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
更新:如果代码:我刚刚成功击败了自己的 32:
void test(char *file_char, unsigned int size)
{
char* file_ = file_char;
char* size_x = file_char+size;
char to_find = 0;
for(unsigned int i = 0; i < 10000; i++)
{
file_char = file_;
while(*file_char++ != to_find);//skip all characters till we find a 0
if(*file_char)//some if in order to avoid compiler removing our test code
cout << "found";
}
}
上面的代码要求 0 在数组中至少出现一次,否则会出现错误,但它比 if 代码快一点,而且更紧凑。
有没有办法让上面的代码更快?(有一个 char 数组并试图找到一个 char 出现的位置)?
我写了一些代码,我真的很困惑。
初始化:
int main()
{
FILE *file;
file = fopen("C:\\data.txt", "rb");
static const int size = 60000;
char *file_char = (char*)malloc(size);
unsigned int i = 0;
while(i < size)
fread(&file_char[i++], 1, 1, file);
clock_t clock_ = clock();
test(file_char, size);
std::cout << ((double)clock()-clock_)/1000;
return 0;
}
下面的代码执行需要 3.5 秒:
void test(char *file_char, unsigned int size)
{
for(unsigned int i = 0; i < 100000; i++)
{
unsigned int pos = 0;
char to_find = 0;
while(pos < size)
if(file_char[pos++] == to_find)
std::cout << "found";
}
}
但下面的代码需要 1.8 秒,时间减半!
void test(char *file_char, unsigned int size)
{
for(unsigned int i = 0; i < 100000; i++)
{
unsigned int pos = 0;
char to_find = 0;
while(pos < size)
{
if(file_char[pos] == to_find)
std::cout << "found";
else if(file_char[pos+1] == to_find)
std::cout << "found";
else if(file_char[pos+2] == to_find)
std::cout << "found";
else if(file_char[pos+3] == to_find)
std::cout << "found";
else if(file_char[pos+4] == to_find)
std::cout << "found";
else if(file_char[pos+5] == to_find)
std::cout << "found";
else if(file_char[pos+6] == to_find)
std::cout << "found";
else if(file_char[pos+7] == to_find)
std::cout << "found";
else if(file_char[pos+8] == to_find)
std::cout << "found";
else if(file_char[pos+9] == to_find)
std::cout << "found";
else if(file_char[pos+10] == to_find)
std::cout << "found";
else if(file_char[pos+11] == to_find)
std::cout << "found";
else if(file_char[pos+12] == to_find)
std::cout << "found";
else if(file_char[pos+13] == to_find)
std::cout << "found";
else if(file_char[pos+14] == to_find)
std::cout << "found";
else if(file_char[pos+15] == to_find)
std::cout << "found";
else if(file_char[pos+16] == to_find)
std::cout << "found";
else if(file_char[pos+17] == to_find)
std::cout << "found";
else if(file_char[pos+18] == to_find)
std::cout << "found";
else if(file_char[pos+19] == to_find)
std::cout << "found";
else if(file_char[pos+20] == to_find)
std::cout << "found";
else if(file_char[pos+21] == to_find)
std::cout << "found";
else if(file_char[pos+22] == to_find)
std::cout << "found";
else if(file_char[pos+23] == to_find)
std::cout << "found";
else if(file_char[pos+24] == to_find)
std::cout << "found";
else if(file_char[pos+25] == to_find)
std::cout << "found";
else if(file_char[pos+26] == to_find)
std::cout << "found";
else if(file_char[pos+27] == to_find)
std::cout << "found";
else if(file_char[pos+28] == to_find)
std::cout << "found";
else if(file_char[pos+29] == to_find)
std::cout << "found";
else if(file_char[pos+30] == to_find)
std::cout << "found";
else if(file_char[pos+31] == to_find)
std::cout << "found";
pos+=32;
}
}
}
我使用的是 Visual Studio 2012 x64,程序从不计算任何东西,因为没有 char 是 0。这怎么解释?如何在不使用 32 个 ifs 的情况下存档相同的性能?
编辑 1:如果我创建 64 个 ifs,与 32 个 ifs 版本相比没有速度提升。
编辑 2:如果我删除 else
并保留 ifs,程序需要 4 秒。
现在,如何解释上述不合理的结果?
最佳答案
您的循环基本上由两个比较组成:pos < size
和 file_char[pos] == to_find
.通过展开循环,您将比较次数从 2 * size 减少到 (size + size/32)。
关于c++ - 低级 C/C++ 性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22072858/
如何在页面内容对象流内的 PDF 页面上居中对齐文本。 从这个开始: q 0 Tr /Helv 12 Tf BT 1 0 0 1 10 10 Tm (Hello)Tj
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 9 年前。 Improv
我正在尝试用简单的工具编写自己的 printf。 这是 printf.c 的代码: #include "printf.h" uint8 pos_x=0, pos_y=0; void printf(ch
我正在尝试在 PDF 中呈现文本。我可以渲染基于矢量的图形,但我也想用文本来陪伴它。 在下面提供的测试代码中,文件(保存为 .pdf 时)将通过矢量图形绘制在左上角显示“测试”。 我想使用以下基于文本
有没有办法在比标准的“lua_pcall”函数调用更细粒度的级别上从 C/C++ 程序运行 Lua 代码?理想情况下,我希望能够遍历一系列低级字节码指令(假设它有这样的东西)并一个一个地运行它们,这样
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
这个问题在这里已经有了答案: Is short-circuiting logical operators mandated? And evaluation order? (7 个答案) 关闭 9 年
我想在 C# 中的单独线程上运行低级键钩来检测某些热键。我该怎么做? 最佳答案 如果你只需要这个键盘钩子(Hook)来检测热键,那么你不应该使用钩子(Hook)。 Windows 通过 Registe
我的应用程序索引最终用户计算机上所有硬盘驱动器的内容。我正在使用 Directory.GetFiles 和 Directory.GetDirectories 递归处理整个文件夹结构。我仅索引了几种选定
我们正在尝试通过多部分文件上传过程上传文件。通过使用下面给出的代码: while (!feof($file)) { $result = $s3->uploadPart(array( 'Buck
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在使用 STM32CubeMX 为 STM32F103 微 Controller 创建一个空白项目。使用 HAL 驱动程序(默认),我得到了一个运行速度非常快的闪烁示例,但我想尝试 LL(低级)驱
如何使用 GoogleAppEngine Low Level API 自动将实体 (com.google.appengine.api.datastore.Entity) 读取到对象中? 有没有什么神奇
我正在寻找在 Tensorflow 中使用 LSTM 单元的 RNN 的低级实现。我已经实现了几个使用低级 API 的前馈网络。这对我理解 ANN 的内部工作原理有很大帮助。我可以对 RNN 做同样的
更新:如果代码:我刚刚成功击败了自己的 32: void test(char *file_char, unsigned int size) { char* file_ = file_char;
作为一个小型(大型)业余爱好项目,我着手用 C# 制作一个(非常原始的)ssh-2.0 客户端。这是为了探索和更好地理解 DH 并帮助提高我对加密的熟悉度:) 根据 RFC 4253,我已经开始这样的
我正在尝试使用 Fuse 低级 API 实现基本文件系统。用于基本的读/写/mknod 操作。如果有人能指出一些示例,将不胜感激,没有关于 fuse 低级 api 的文档。 任何帮助将不胜感激! 最佳
我所拥有的是直接访问 Atmel CPU 上的四个 JTAG 接口(interface)引脚。 我需要的是低级 C 代码来调整这些引脚并实现两个功能: ReadMemoryWord(address)
我正在开发一个由多个部分组成的程序,这些部分相互构建。第一个程序必须从文件中读取内容并将由空格分隔的内容写入新文件。程序二应该采用这个单词,并根据它是以元音还是辅音开头的规则添加pig latin,并
我想对 yml 文件中的值进行一些处理。有人建议我使用snakeYAML的low-level API以此目的。因此,我使用它编写了一些代码,但由于以下原因,我几乎陷入困境。 这是我编写的代码: pub
我是一名优秀的程序员,十分优秀!