Tag: 优化

如何在CSS中使用3位数的颜色代码而不是6位数的颜色代码?

我最近浏览了我的CSS文件,并将所有6位hex代码切换为简单的3位代码(例如,我的#FDFEFF缩短为#FFF )。 它呈现出与以前几乎完全相同的颜色,在我看来,在两个部分之间是相当无用的,删除它们在我的CSS文件中保存了整个300字节。 使用哪个版本有关系吗? 我很less遇到只使用3位数字代码的网站(或者我想我从来没有碰到过这样的代码)。 使用3位密码,还是6位密码,还是我们应该使用完整的6位密码?

C ++迭代器和循环优化

我看到很多c ++代码,如下所示: for( const_iterator it = list.begin(), const_iterator ite = list.end(); it != ite; ++it) 与更简洁的版本相反: for( const_iterator it = list.begin(); it != list.end(); ++it) 这两个公约的速度会有什么不同? 天真的第一个会稍微快一点,因为list.end()只调用一次。 但是因为迭代器是const的,所以编译器似乎会将这个testing从循环中拉出来,为两者产生相同的程序集。

为什么编译器不会将浮点数* 2优化为指数增量?

我经常注意到gcc把乘法转换成可执行文件的转换。 乘以一个int和一个float可能会发生类似的情况。 例如, 2 * f可以简单地将f的指数递增1,从而节省一些周期。 做编译器,也许如果有人要求他们这样做的话(比如通过-ffast-math ),一般来说,这样做吗? 编译器是否足够聪明可以做到这一点,或者我需要使用scalb*()或ldexp()/frexp()函数族自己来做这scalb*()吗?

原生的方式来合并在Javascript中的对象

Javascript的对象没有任何本地合并操作。 如果你有两个对象,说 {a:1, b:2} {c:3, d:4} 并想要得到 {a:1, b:2, c:3, d:4} 据我所知,你必须迭代对象。 也就是说,你决定合并左边还是合并右边的策略,然后你做一些像(简化) for (key in object2) { object1[key] = object2[key]; } 这可以。 但是,JavaScript具有call和prototypefunction。 例如,将arguments转换成一个Array可以完成 Array.prototype.slice.call(arguments) 这种方法利用了现有的本地代码,因此不易受程序员愚蠢的影响,而且运行速度比非本地实现要快。 这个问题 在DOM的Attribute或Node遍历function上使用这个原型/调用模式,或者为了做一个本地对象合并而使用一些通用的String函数,有没有一个技巧? 代码看起来像这样: var merged = somethingrandom.obscuremethod.call(object1, object2) 结果,你会得到一个没有遍历的本地合并。 一个可能的,次优的解决scheme 如果您可以使用Object的constructor属性,然后强制一个对象具有另一个对象的构造函数,然后在复合对象上运行new的对象,则可以免费获得合并。 但是我没有牢牢把握JavaScript中的constructor的全部含义来完成这个调用。 引理 同样的问题也适用于Arrays 。 一个常见的问题是取7个数组,然后尝试找出这些数组的交集。 也就是说,所有7个数组中存在哪个数字。 你可以将它们连接在一起,然后做一个sorting,然后做一个遍历。 但是如果有一个通用的相交位置,我们可以强制一个数组在本地执行,那将会很好。 有什么想法吗? 编辑: 到达那里的一半 对于数组问题,您可以执行以下操作: array.concat(a,b,c).sort()。join(':'),然后使用一些棘手的RegExp捕获和重复模式来遍历。 RegExp的实现,如果你不知道,运行在一个非常简单的基于栈的虚拟机上。 当你初始化你的正则expression式,这实际上是一个被编译的程序(RegExp.compile是一个不推荐使用的JS方法)。 然后,当地人以一种极快的方式跑过绳子。 也许你可以利用这个成员的门槛,并取得更好的performance… […]

foldl是尾recursion,那么foldr怎么比foldl跑得快呢?

我想testingfoldl vs foldr。 从我看到你应该使用foldl在任何时候都可以由于尾巴reccursion优化。 这是有道理的。 但是,运行这个testing后,我很困惑: (使用时间命令需要0.057s): a::a -> [a] -> [a] ax = ([x] ++ ) main = putStrLn(show ( sum (foldr a [] [0.. 100000]))) foldl(使用时间命令时需要0.089s): b::[b] -> b -> [b] b xs = ( ++ xs). (\y->[y]) main = putStrLn(show ( sum (foldl b [] [0.. 100000]))) 很显然,这个例子是微不足道的,但是我为什么会打败foldl而感到困惑。 这不是一个明确的情况下foldl胜利吗?

如何在一个表中find在另一个表中没有相应行的行

我有两个表之间的1:1关系。 我想查找表A中没有表B中相应行的所有行。我使用这个查询: SELECT id FROM tableA WHERE id NOT IN (SELECT id FROM tableB) ORDER BY id desc id是两个表中的主键。 除了主键索引之外,我还有一个tableA(id desc)索引。 使用H2(Javaembedded式数据库),这将导致tableB的全表扫描。 我想避免全表扫描。 我怎样才能重写这个查询来快速运行? 我应该怎样指数?

正则expression式的最坏情况分析

是否有任何工具会采用特定的正则expression式,并根据正则expression式所匹配的特定字符数所需的操作数返回最差的情况? 例如,给定一个(f|a)oo.*[ ]baz ,引擎可能通过多less个步骤来匹配100个字符? 如果有一个工具,可以采取一堆文本样本,并显示每个运行的平均操作,我也会感兴趣。 我意识到这将取决于所使用的引擎和实现 – 但我不知道这是多么普遍。 所以,如果它是很多语言的常见(使我的问题太模糊),我会特别感兴趣的Perl和Python。

有关GHC实施的好介绍性文字?

在Haskell中编程时(特别是在解决Project Euler问题时,次优解决scheme往往会强调CPU或内存的需求),我经常困惑为什么程序的行为是这样的。 我看着简介,尝试引入一些严格的,select另一个数据结构,但大多数是在黑暗中摸索,因为我缺乏一个良好的直觉。 另外,虽然我知道Lisp,Prolog和命令式语言是如何实现的,但我不知道如何实现一个懒惰的语言。 我也有点好奇。 因此,我想更多地了解从程序源到执行模型的整个链。 我想知道的事情: 典型的优化应用了什么? 当有多个候选人进行评估时,执行顺序是什么(虽然我知道它是由所需的输出驱动的,但是先评估A然后再评估B或者先评估B以检测你不需要A) thunk代表什么? 如何堆栈和堆使用? 什么是CAF? (分析表明有时热点在那里,但我不知道)

对于{A = a; B = B; },在“B = b”之前会严格执行“A = a”吗?

假设A , B , a和b都是variables, A , B , a和b的地址都是不同的。 然后,对于下面的代码: A = a; B = b; C和C ++标准明确要求A=a在B=b之前严格执行吗? 鉴于A , B , a和b的地址都不相同,编译器是否允许为了某种目的(如优化)交换两个语句的执行顺序? 如果我的问题的答案在C和C ++中是不同的,我想知道两者。 编辑:问题的背景是以下。 在棋盘游戏AIdevise中,为了优化,人们使用无锁共享哈希表 ,如果我们不添加volatile限制,其正确性强烈依赖于执行顺序。

Ackermann与Haskell / GHC非常低效

我试着计算Ackermann(4,1) ,不同语言/编译器之间的性能差别很大。 以下是我的Core i7 3820QM,16G,Ubuntu 12.10 64bit , C:1.6s , gcc -O3 (用gcc 4.7.2) int ack(int m, int n) { if (m == 0) return n+1; if (n == 0) return ack(m-1, 1); return ack(m-1, ack(m, n-1)); } int main() { printf("%d\n", ack(4,1)); return 0; } OCaml:3.6s , ocamlopt (ocaml 3.12.1) let rec ack = […]