Questions tagged «performance»

对于与代码的度量或改进以及应用程序效率有关的问题。

2
为什么检查字典是否包含键而不是捕获异常(如果没有包含键)会更快呢?
想象一下代码: public class obj { // elided } public static Dictionary<string, obj> dict = new Dictionary<string, obj>(); 方法一 public static obj FromDict1(string name) { if (dict.ContainsKey(name)) { return dict[name]; } return null; } 方法2 public static obj FromDict2(string name) { try { return dict[name]; } catch (KeyNotFoundException) { return null; …

2
为什么处理排序数组要比未排序数组慢?
我有500000个随机生成的Tuple<long,long,string>对象的列表,在这些对象上执行简单的“之间”搜索: var data = new List<Tuple<long,long,string>>(500000); ... var cnt = data.Count(t => t.Item1 <= x && t.Item2 >= x); 当我生成随机数组并为100个随机生成的值运行搜索时x,搜索将在大约四秒钟内完成。知道排序确实会对搜索产生很大的影响,但是,我决定在运行100次搜索之前先对数据进行排序Item1,然后再按,再按Item2,最后按Item3- 进行排序。由于分支预测,我希望排序后的版本执行得更快:我的想法是,一旦到达Item1 == x,所有进一步的检查t.Item1 <= x都会正确地预测分支为“ no take”,从而加快分支的尾部。搜索。令我惊讶的是,在排序数组上进行搜索的时间是原来的两倍! 我尝试切换实验顺序,并为随机数生成器使用了不同的种子,但是效果是一样的:在未排序的数组中搜索的速度几乎是在同一数组中搜索速度的两倍,但是排序! 有谁能很好地解释这种奇怪的影响?我测试的源代码如下;我正在使用.NET 4.0。 private const int TotalCount = 500000; private const int TotalQueries = 100; private static long NextLong(Random r) { var data …

12
使用“ var”会影响性能吗?
早些时候我问了一个问题,为什么我看到如此多的示例使用该var关键字并得到答案,尽管仅对于匿名类型是必需的,但仍使用它来使代码写得“更快速” /更容易并且“正因为如此”。 通过该链接(“ C#3.0-Var Is't Objec”),我看到它已var被编译为IL中正确的类型(您将在文章中途看到它)。 我的问题是,使用var关键字take可以获取多少IL代码(如果有的话),并且如果在各处使用它,它的性能甚至还可以接近吗?
230 c#  performance  variables  var 


2
在具有240个或更多元素的数组上循环时,为什么会对性能产生较大影响?
当在Rust中的数组上运行求和循环时,当CAPACITY> = 240 时,我注意到性能大幅下降。CAPACITY= 239快80倍。 Rust对“短”数组进行了特殊的编译优化吗? 与编译rustc -C opt-level=3。 use std::time::Instant; const CAPACITY: usize = 240; const IN_LOOPS: usize = 500000; fn main() { let mut arr = [0; CAPACITY]; for i in 0..CAPACITY { arr[i] = i; } let mut sum = 0; let now = Instant::now(); for _ …

30
递归还是迭代?
如果我们在算法可以使用相同目的的情况下使用循环而不是递归,反之亦然吗?例如:检查给定的字符串是否是回文。我已经看到许多程序员使用递归来证明简单的迭代算法何时可以胜任。编译器在决定使用什么时起重要作用吗?


4
为什么引入无用的MOV指令会加速x86_64汇编中的紧密循环?
背景: 在使用嵌入式汇编语言优化某些Pascal代码时,我注意到一个不必要的MOV指令,并将其删除。 令我惊讶的是,删除了不必要的指令使我的程序变慢了。 我发现添加任意,无用的MOV指令可以进一步提高性能。 效果是不稳定的,并且会根据执行顺序而变化:同一行垃圾指令在一行中上下移动会导致速度降低。 我知道CPU会进行各种优化和精简,但这似乎更像是黑魔法。 数据: 我的代码版本在运行时间的循环中间有条件地编译了三个垃圾操作2**20==1048576。(周围的程序只计算SHA-256哈希值)。 我的旧机器(Intel(R)Core(TM)2 CPU 6400 @ 2.13 GHz)上的结果: avg time (ms) with -dJUNKOPS: 1822.84 ms avg time (ms) without: 1836.44 ms 程序循环运行25次,每次运行顺序随机更改。 摘抄: {$asmmode intel} procedure example_junkop_in_sha256; var s1, t2 : uint32; begin // Here are parts of the SHA-256 algorithm, in Pascal: // …


3
为什么转置512x512的矩阵要比转置513x513的矩阵慢得多?
在对不同大小的正方形矩阵进行了一些实验之后,出现了一个模式。不变地,转置大小矩阵2^n比转置size 慢2^n+1。对于的较小值n,差异不大。 但是,相差超过512。(至少对我而言) 免责声明:我知道由于元素的两次交换,该函数实际上并未转置矩阵,但没有区别。 遵循代码: #define SAMPLES 1000 #define MATSIZE 512 #include <time.h> #include <iostream> int mat[MATSIZE][MATSIZE]; void transpose() { for ( int i = 0 ; i < MATSIZE ; i++ ) for ( int j = 0 ; j < MATSIZE ; j++ ) { int aux = …



24
字符串与StringBuilder
我明白之间的差别String和StringBuilder(StringBuilder是可变的),但两者之间有较大的性能差异? 我正在处理的程序有很多大小写驱动的字符串追加(500+)。使用StringBuilder更好的选择吗?
215 c#  .net  performance 

13
如果性能很重要,我应该使用Java的String.format()吗?
我们必须一直构建String以便进行日志输出等等。在JDK版本中,我们了解了何时使用StringBuffer(很多追加,线程安全)和StringBuilder(很多追加,非线程安全)。 有什么使用建议String.format()?是高效的,还是在性能很重要的情况下,我们被迫坚持采用单线连接? 例如丑陋的旧风格, String s = "What do you get if you multiply " + varSix + " by " + varNine + "?"; 与整洁的新样式(String.format,可能会更慢)相比, String s = String.format("What do you get if you multiply %d by %d?", varSix, varNine); 注意:我的特定用例是整个代码中数百个“单行”日志字符串。它们不涉及循环,所以StringBuilder也太笨重。我String.format()特别感兴趣。


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.