- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我试图在不使用条件的情况下重复一段代码,但仍然只重复特定次数。
基本上,是这样的:
repeat(50)
{
//Do stuff here.
}
有没有办法做到这一点?除了复制和粘贴 50 次?
我这样做是因为我想如果我知道我想重复某件事多少次,它会比每次都检查条件更快。那是准确的吗?或者我是否仍会检查重复了多少次?
基本上,它是否更快?
最佳答案
您尝试通过使用某些构造(包括手动剪切和粘贴代码)来优化循环的执行速度来优化循环是不明智的。不要这样做;它可能会“取消优化”执行速度。
在我遇到过的任何 C++ 实现中(MSVC 6.0、2003、2005、2010、GCC 各种版本、Diab 各种版本),绝对是零,抱歉我没有强调足够,零,涉及的时间分配循环计数变量,假设为分配循环计数变量的函数分配了任何其他变量。对于不进行函数调用的简单循环,循环计数变量可能永远不会进入内存;它可以在整个生命周期内完全保存在一个 CPU 寄存器中。即使它存储在内存中,它也会在运行时堆栈中,并且它(和任何其他局部变量)的空间将在一次操作中一次性全部声明,这不会花费更多或更少的时间,具体取决于分配在栈上的变量。像循环计数器变量这样的局部变量是在堆栈上分配的,堆栈分配是 CHEAP CHEAP CHEAP,而不是堆分配。
堆栈上的循环计数器变量分配示例:
for (int i=0; i<50; ++i) {
....
}
堆栈上循环计数器变量分配的另一个例子:
int i = 0;
for (; i<50; ++i) {
....
}
在堆上分配的示例循环计数器变量(不要这样做;这很愚蠢):
int* ip = new int;
for (*ip=0; *ip<50; ++(*ip)) {
....
}
delete ip;
现在解决尝试通过手动复制和粘贴而不是使用循环和计数器来优化循环的问题:
您正在考虑做的是一种手动形式的循环展开。循环展开是一种优化,编译器有时会使用它来减少循环中涉及的开销。只有在编译时可以知道循环的迭代次数(即迭代次数是一个常数,即使该常数涉及基于其他常数的计算),编译器才能做到这一点。在某些情况下,编译器可能会确定展开循环是值得的,但通常不会将其完全展开。例如,在您的示例中,编译器可能会确定将循环从 50 次迭代展开到只有 10 次迭代和 5 个循环体拷贝将具有速度优势。循环变量仍然存在,但不再对循环计数器进行 50 次比较,现在代码只需要进行 10 次比较。这是一个权衡,因为循环体的 5 个拷贝占用了缓存中 5 倍的空间,这意味着加载相同指令的那些额外拷贝会强制缓存驱逐(丢弃)已经存在的许多指令缓存以及您可能希望保留在缓存中的内容。此外,在循环根本没有展开的情况下,从主内存加载循环体指令的这 4 个额外拷贝比简单地从缓存中获取已加载的指令要花费更长的时间。
所以总而言之,只使用循环体的一个拷贝并继续并保留循环逻辑通常更有利。 (即根本不要展开任何循环。)
关于c++ - 重复一段代码固定次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16268863/
你好,我有一张 table : from | to | item | count ------- Jack | Danie| food | 10 Danie| Maria| food | 2 Ja
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎偏离主题,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或 include a mini
我正在尝试解决以下面试问题 Given two arrays firstDay and lastDay representing the intervals in days of possible m
这个问题已经有答案了: Explanation of a output of a C program involving fork() (2 个回答) 已关闭 9 年前。 这是我从我的研究所去年的试卷
如何在 html 页面上重复一个 div X 次,可以说我想设置方差来声明重复次数。重复这个部分 5 次,我假设它是用 JS 的。 black BLUE WHITE strip 我
我目前使用类中的函数将数据插入数据库,如果每行成功插入(从 csv 文件),则会记录一条消息(logMessage 函数),以显示哪一行成功或失败。但是我想要已导入数据库的成功执行的计数。我遇到了一些
这个问题可能看起来非常基础,但我很难弄清楚如何做。我有一个整数,我需要使用 for 循环来循环整数次。 首先,我尝试了—— fn main() { let number = 10; // An
我正在准备 CS 125 期末考试,其中(简要地)介绍了 Big O Notation。 鉴于: Mergesort 的最佳运行时间为 O(N lg(N)),最坏运行时间为 O(N lg (N)) 有
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 3 年前。 Improve this qu
我正在构建一个简单的程序来计算骰子实验中数字的频率,但我尝试扩展它并将最大 throw 次数增加到巨大的数字,通过反复试验,我发现最大限制为519253。 使用这个最大值,我也无法创建任何新数组,它会
这是一道面试题 There is an airline company that wants to provide new updates to all of its flight attendant
我正在尝试以一种可以节省我无数小时的繁琐数据输入的方式实现 Excel 自动化。这是我的问题。 我们需要为所有库存打印条形码,其中包括 4,000 种型号,每种型号都有特定数量。 Shopify是我们
我想根据给定的预定义级别(从级别 1 到级别 6)分离代码中的所有内容,现在我的 JSON 读取 $scope.myJson=[{ id: 1, level: 1, name: "any
我创建了一个菜单,它使用一些 CSS 和 jquery 在悬停时显示其子菜单。事情是,如果用户在菜单项上多次悬停,它会有点滑稽。这是网址:http://91.202.168.37/~ibi/ ,这是
假设我对每小时的事件数进行了如下统计: np.random.seed(42) idx = pd.date_range('2017-01-01', '2017-01-14', freq='1H') df
我想确保我正确理解了这个概念: 在 Hadoop 权威指南中指出:“设计文件系统的目标始终是减少与要传输的数据量相比的查找次数。”在此声明中,作者指的是 Hadoop 逻辑 block 的“seeks
我有一个用 C++11 编写的程序,我想计算 std::vector 的 move 和复制(构造和赋值)次数。对象。有办法吗? 最好的问候 最佳答案 否。 std::vector<>的执行没有办法做到
我们组织的帐户空间不足,我们一直在尝试剔除一些较旧的存储库。问题在于一些较旧的存储库可能仍然是事件服务的依赖项(即使它们多年未更新)。 我知道我们可以跟踪克隆,但据我所知,我们看不到直接下载/pull
我是一名优秀的程序员,十分优秀!