Questions tagged «optimization»

优化是改进方法或设计的行为。在编程中,优化通常采取提高算法速度或减少所需资源的形式。优化的另一个含义是机器学习中使用的数值优化算法。

3
C ++:将一个操作数保留在寄存器中的速度大大提高
我一直在尝试通过定时使用以下代码对数组元素进行缩放和求和的例程来了解在L1缓存中存储数组对内存的影响(我知道我应该将结果按'最后是a';关键是要在循环内进行乘法和加法-到目前为止,编译器尚未弄清楚要分解出'a'): double sum(double a,double* X,int size) { double total = 0.0; for(int i = 0; i < size; ++i) { total += a*X[i]; } return total; } #define KB 1024 int main() { //Approximately half the L1 cache size of my machine int operand_size = (32*KB)/(sizeof(double)*2); printf("Operand size: %d\n", operand_size); …

8
在C中使用strict关键字的规则?
我试图了解何时以及何时不使用 restrictC中关键字,以及在什么情况下它提供了明显的好处。 阅读了“ Demystifying The Restrict Keyword ”(提供了一些使用经验的规则)后,我得到的印象是,当函数传递指针时,它必须考虑所指向的数据可能重叠的可能性(别名)并将任何其他参数传递到函数中。给定一个功能: foo(int *a, int *b, int *c, int n) { for (int i = 0; i<n; ++i) { b[i] = b[i] + c[i]; a[i] = a[i] + b[i] * c[i]; } } 编译器必须c在第二个表达式中重新加载,因为也许b并c指向同一位置。由于相同的原因,它还必须等待b存储后才能加载a。然后,它必须等待a存储和必须重新加载b,并c在下一循环的开始。如果您像这样调用函数: int a[N]; foo(a, a, a, N); 然后您会看到编译器为什么必须这样做。restrict有效使用会告诉编译器您永远都不会这样做,因此它可以删除存储的冗余负载c和a之前的负载b。 在另一篇SO文章中,Nils Pipenbrinck提供了此方案的一个有效示例,展示了性能优势。 到目前为止,我已经收集到,使用它是一个好主意 …
69 c  optimization  memory 

8
HTML中的<script>标记位置是否会影响网页的性能?
如果脚本标签在HTML页面中的正文上方或下方,那么这对网站的性能有影响吗? 以及如果在这样之间使用: &lt;body&gt; ..blah..blah.. &lt;script language="JavaScript" src="JS_File_100_KiloBytes"&gt; function f1() { .. some logic reqd. for manipulating contents in a webpage } &lt;/script&gt; ... some text here too ... &lt;/body&gt; 还是更好? &lt;script language="JavaScript" src="JS_File_100_KiloBytes"&gt; function f1() { .. some logic reqd. for manipulating contents in a webpage } &lt;/script&gt; &lt;body&gt; ..blah..blah.. …

8
如果我将Objective-C用于低级代码,我的iPhone应用程序是否会对性能产生影响?
在iPhone或其他便携式硬件上对CPU密集型或GPU密集型应用程序进行编程时,必须做出明智的算法决策,以加快代码速度。 但是,如果您使用的语言比另一种语言的性能差,那么即使算法选择很好,也可能会很慢。 是否有任何硬数据将Objective-C与C ++进行比较,尤其是在iPhone上,但可能仅在Mac桌面上,以比较各种类似语言的性能?我对比较C和Objective-C的这篇文章非常熟悉,但这是将两种面向对象的语言相互比较的一个更大的问题。 例如,C ++ vtable查找真的比Obj-C消息快吗?快多少?线程化,多态性,排序等。在我寻求使用重复的对象模型和各种测试代码构建项目之前,我想知道是否有人已经这样做以及在何处得到结果。这种类型的测试和比较本身就是一个项目,可能会花费大量时间。也许这不是一个项目,但是可以比较两个,只有输出。 我在寻找硬数据,而不是传福音。像你们中的许多人一样,出于各种原因,我爱又恨这两种语言。此外,如果外面有人积极地追求同样的事情,那么我会投入一些代码来查看最终结果,这很有趣,而且我相信其他人也会提供帮助。我的猜测是它们都有长处和短处,我的目标是精确地找出它们是什么,以便在实际情况下可以避免/利用它们。

12
在Java中移位位是否比乘法和除法快?。净?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 改善这个问题 如果您恰好使用2的幂,则在大多数(甚至甚至是所有)CPU上,向左和向右移位位显然比乘法和除法运算快。但是,对于某些阅读器和某些算法,这样做可能会降低代码的清晰度。移位确实是提高性能所必需的,还是我可以期望编译器或VM注意到这种情况并对其进行优化(特别是当2的幂是文字时)?我主要对Java和.NET的行为感兴趣,但也欢迎对其他语言实现有深入的了解。

3
我可以期望Dalvik和Android工具链有哪些优化?
我正在开发一个高性能的Android应用程序(游戏),尽管我首先尝试编写代码以提高可读性,但我还是想在脑海中默默地了解引擎盖下正在发生的事情。使用C ++,我对编译器将为我做什么和不为我做什么有了很好的直觉。我正在尝试对Java / Android执行相同的操作。 因此,这个问题。我在网络上找不到关于该主题的信息。Java编译器,Dalvik转换器(dx)和/或JITter(在Android 2.2+上)是否会执行以下优化? 方法内联。在什么条件下?private始终可以安全地内联方法;会完成吗?public final方法怎么样?其他类的对象上的方法?static方法?如果编译器可以轻松推断出对象的运行时类型怎么办?我应该声明方法final还是static尽可能声明方法? 常见子表达式消除。例如,如果我访问someObject.someField两次,查找将仅执行一次吗?如果是给吸气剂打电话怎么办?如果我两次使用算术表达式怎么办?只会评估一次吗?如果我使用某个表达式的结果作为for循环的上限,该表达式的值我不知道会改变怎么办? 边界检查数组查找。工具链会在某些情况下(例如原型for循环)消除这种情况吗? 价值内联。是否public static final int总是会内联访问某些内容?即使他们在另一个班上?即使他们在另一个包裹中? 分支预测。这甚至有多大的问题?在典型的Android设备上分支性能是否受到重大影响? 简单的算术。会someInt * 2被取代someInt &lt;&lt; 1吗? Etcetera ...




3
为什么用Rcpp较慢地优化R目标函数,为什么呢?
我目前正在研究一种贝叶斯方法,该方法每次迭代都需要多项步骤来优化多项式logit模型。我正在使用optim()进行这些优化,并用R语言编写了一个目标函数。分析显示optim()是主要瓶颈。 深入研究后,我发现了这个问题,他们建议重新编码目标函数Rcpp可以加快处理过程。我遵循了该建议,并使用编码了我的目标函数Rcpp,但结果变慢了(大约慢了两倍!)。 这是我的第一次Rcpp(或与C ++有关的任何事情),但是我找不到找到矢量化代码的方法。任何想法如何使其更快? Tl; dr:Rcpp中函数的当前实现不如矢量化R快;如何使其更快? 一个可重现的示例: 1)在R和中定义目标函数Rcpp:仅截取多项式模型的对数似然 library(Rcpp) library(microbenchmark) llmnl_int &lt;- function(beta, Obs, n_cat) { n_Obs &lt;- length(Obs) Xint &lt;- matrix(c(0, beta), byrow = T, ncol = n_cat, nrow = n_Obs) ind &lt;- cbind(c(1:n_Obs), Obs) Xby &lt;- Xint[ind] Xint &lt;- exp(Xint) iota &lt;- c(rep(1, (n_cat))) denom &lt;- log(Xint %*% …
16 c++  r  optimization  rcpp 

3
查找包含200000+个元素的2个数组元素的最小乘积的最快方法
我有一个数组a[n]。该号码n由我们输入。我需要找到的最小的产品a[i]和a[j]如果: 1) abs(i - j) &gt; k 2)a[i] * a[j]最小化 这是我的解决方案(非常幼稚): #include &lt;iostream&gt; using namespace std; #define ll long long int main() { ll n,k; cin &gt;&gt; n &gt;&gt; k; ll a[n]; for(ll i=0;i&lt;n;i++) cin &gt;&gt; a[i]; ll mn; bool first = true; for(ll i=0;i&lt;n;i++) { for(ll j=0;j&lt;n;j++) { if(i!=j) …

2
Java:手动展开的循环仍比原始循环快。为什么?
考虑下面两个长度为2的代码片段: boolean isOK(int i) { for (int j = 0; j &lt; filters.length; ++j) { if (!filters[j].isOK(i)) { return false; } } return true; } 和 boolean isOK(int i) { return filters[0].isOK(i) &amp;&amp; filters[1].isOK(i); } 我认为,经过充分的预热后,这两块琴的性能应该相似。 我已经使用JMH微基准测试框架对此进行了检查,如此处和此处所述,并观察到第二个片段的运行速度提高了10%以上。 问题:为什么Java没有使用基本循环展开技术优化我的第一个代码段? 特别是,我想了解以下内容: 我可以很容易地产生一个代码,为2个滤波器的情况下最佳的,仍然可以在过滤器另一个号码的情况下工作(想象一个简单的建造者): return (filters.length) == 2 ? new FilterChain2(filters) : new FilterChain1(filters)。JITC可以这样做吗?如果不能,为什么? …

4
是否有一个C代码片段,可以在不使用编译器内置函数的情况下有效地计算溢出安全加法?
这是一个C函数,将C添加int到另一个函数,如果发生溢出将失败: int safe_add(int *value, int delta) { if (*value &gt;= 0) { if (delta &gt; INT_MAX - *value) { return -1; } } else { if (delta &lt; INT_MIN - *value) { return -1; } } *value += delta; return 0; } 不幸的是,GCC或Clang 无法对其进行优化: safe_add(int*, int): movl (%rdi), %eax testl …

1
高效的字符串截断算法,顺序删除相等的前缀和后缀
每次测试的时间限制:5秒 每次测试的内存限制:512 MB 系统会为您提供一串s长度n(n≤5000)的字符串。您可以选择该字符串的任何适当前缀(也就是其后缀),然后删除所选的前缀或相应的后缀。然后,您可以对结果字符串应用类似的操作,依此类推。应用最佳操作顺序后,最终字符串的最小长度是多少? 输入 每个测试的第一行包含一个s由小英文字母组成的字符串。 输出 输出单个整数-最终字符串的最小长度,可以在应用此类操作的最佳顺序后实现。 例子 +-------+--------+----------------------------------+ | Input | Output | Explanation | +-------+--------+----------------------------------+ | caaca | 2 | caaca → ca|aca → aca → ac|a → ac | +-------+--------+----------------------------------+ | aabaa | 2 | aaba|a → a|aba → ab|a → ab | +-------+--------+----------------------------------+ | abc …

3
我可以关闭优化吗​​,所以闭包中的范围内变量不会被“优化”
作为现代浏览器完成代码优化的副产品,在调试时,您无法“看到”“实际上”在范围内的所有变量。这是众所周知的,并且已经在SO上的上一个问题中得到了解决。此功能虽然在生产中最肯定有用,但在开发过程中却使我很烦,但它会使我放慢速度(这很明显)。 现在我的问题是,有什么办法可以关闭这种行为?我可以编辑一些配置文件,还是有浏览器插件,或者有浏览器可执行文件的“开发人员专用构建版本”?我喜欢在编写新代码时立即在控制台中输入代码,所以这确实困扰了我。 更新/编辑 这是部分解决方案,应归功于Paul1365972。 您必须使用特殊选项从命令行启动chrome浏览器,如下所示: 完全关闭Chrome 从控制台运行Chrome "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe" --js-flags="--allow-natives-syntax" ,适用于Windows其他操作系统。 打开开发人员控制台并执行"%GetHeapUsage()"。如果您使用选项正确启动了Chrome,则会在控制台上记录一个数字,否则会出现语法错误。 使用此命令行标志,您可以使用以开头的命令与V8引擎“对话” %,这是普通JavaScript中的语法错误。Paul的答案中列出了可用的此类V8命令。 有%NeverOptimizeFunction()该列表,这是一些东西,看起来像的东西我只需要调用,并用它做的。不幸的是,该功能没有实现我所希望的,如下面的屏幕快照所示。 (((在保罗的回答其他链接(V8本地人节点模块)并不那么重要,对我们这里在这种情况下,它所做的就是它环绕的“%”功能调用单行这样的代码不会崩溃不是v8的浏览器。))) ((((((我记得有一次它是在那时(尚未发明/实现这种优化)。我不知道多久。十年?十五年?类似的东西。最后一个Chrome版本是什么(如果任何)以及您可以做什么的最后一个Firefox版本(请确保在此存在)是什么?如果您碰巧知道并将其发布为答案,它不会给您带来悬赏,但会给您带来赞誉。 。))) 解决方案 谢谢彼得·斯尼科克 新问题 虽然Petr的解决方案有很大帮助,但这并不完美。这个问题太长了,所以我发布了一个新的问题,关于如何改进Petr的解决方案。(我当然可以在这里编辑此问题,但是,如果您了解我的意思,那将感到“不历史”。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.