对于那些不熟悉D字符串mixins的人来说,它们基本上是编译时间的.您可以获取任何编译时字符串(无论是文字还是通过模板元编程或编译时函数评估生成)并将其编译为代码.如果你使用一个简单的字符串文字,它基本上是编译器自动复制粘贴.
您是否认为使用字符串混合文字作为简单代码重用的方法是反模式,而其他分解方法不太合适?一方面,它基本上是编译器自动化的文字复制和粘贴,这意味着一旦混合在实例中就没有任何关系.如果字符串mixin中的符号与混合范围中的符号发生碰撞,则会发生错误(尽管在编译时,而不是在运行时).它是相对非结构化的,例如,可以将一个字符串混合到一个函数的中间,当且仅当范围中的变量根据某个约定命名时才会起作用.Mixins还可以声明外部作用域随后可以使用的变量.
另一方面,因为复制和粘贴是编译器自动化的,所以在源代码级别的代码有一个单一的真实点,如果需要修改它,它只需要在一个地方修改,一切都保持同步.字符串mixins还大大简化了重用代码,这些代码很难以任何其他方式考虑因素,否则很有可能被手动剪切和粘贴.
C++ 0x标准即将完成.到目前为止,我已经涉足了C++,但是我没有彻底学习它,因为它似乎缺少了许多我在其他语言中被宠坏的现代功能.但是,我对C++ 0x非常感兴趣,它解决了很多我的抱怨.在批准标准之后,对于主要编译器供应商提供合理完整的,生产质量的实现需要多长时间的任何猜测?它是否会很快发生,以扭转C++受欢迎程度的下降,还是太少,太迟了?你是否相信C++ 0x会在几年内成为"C++",或者你是否相信大多数人会在实践中坚持早期的标准而且C++ 0x会有点像混蛋的继子,有点像C99?
以下是我需要的数据结构的一些约束.看起来没有一个共同的数据结构(我会提到我在下面想到的那些)都很适合这些.任何人都可以建议一个我可能没有想到的吗?
我正在运行一项计算量很大的科学工作,不时地吐出结果.这项工作基本上只是为了模拟相同的事情,所以它分为几台使用不同操作系统的计算机.我想将所有这些实例的输出定向到同一个文件,因为所有计算机都可以通过NFS/Samba看到相同的文件系统.以下是约束:
我正在使用的语言是D,如果重要的话.我看,标准库中似乎没有任何东西可以做到这一点.D语言和一般语言无关的答案都是完全可以接受和赞赏的.
生成随机列联表的有效方法是什么?列联表被定义为矩形矩阵,使得每行的总和是固定的,并且每列的总和是固定的,但是只要每行和列的总和是正确的,各个元素可以是任何一个.
请注意,生成随机列联表非常容易,但我正在寻找比天真算法更有效的东西.
将内联汇编程序插入到类似C语言的函数中时,关于允许哪些寄存器用于临时的约定是什么?编译器是否有责任在进入asm块之前保存需要保存的所有寄存器的值?程序员是否有责任将值存储在这些寄存器中并在退出asm块之前恢复它们?是否有典型的约定,或者这是特定于实现的?
我正在开发一个项目,我需要存储一个由两个字符串键索引的数字矩阵.矩阵不是锯齿状的,即如果任何行都存在列密钥,那么它应该存在于所有行中.同样,如果任何列都存在行键,则它应存在于所有列中.
表达这一点的显而易见的方法是使用关联数组的关联数组,但这既笨拙又效率低,并且它不强制执行非锯齿状属性.是否有任何流行的编程语言提供了一种内置于语言中或作为标准库的一部分的关联矩阵?如果是这样,它们如何在API和实现级别上工作?我正在为这个项目使用Python和D,但是其他语言的例子仍然有用,因为我可以查看API并找出在Python或D中实现类似内容的最佳方法.
我有一个以下微小的Python方法,它是迄今为止性能热点(根据我的分析器,在这里花费了大约95%的执行时间)在一个更大的程序中:
def topScore(self, seq):
ret = -1e9999
logProbs = self.logProbs # save indirection
l = len(logProbs)
for i in xrange(len(seq) - l + 1):
score = 0.0
for j in xrange(l):
score += logProbs[j][seq[j + i]]
ret = max(ret, score)
return ret
Run Code Online (Sandbox Code Playgroud)
代码是在Python的Jython实现中运行,而不是CPython,如果这很重要的话. seq是一个DNA序列串,大约有1,000个元素. logProbs是一个词典列表,每个位置一个.目标是找到任何长度l(大约10-20个元素)的子序列的最大分数seq.
我意识到所有这些循环由于解释开销而效率低下,并且在静态编译/ JIT语言中会更快.但是,我不愿意切换语言.首先,我需要一个JVM语言用于我正在使用的库,这种约束我的选择.其次,我不想将此代码批量转换为较低级别的JVM语言.但是,如果有必要,我愿意用其他东西重写这个热点,虽然我不知道如何连接它或者开销是多少.
除了这种方法的单线程缓慢之外,我还无法让程序在并行化方面超过4个CPU.鉴于它几乎所有的时间都花在我发布的10行热点上,我无法弄清楚这里的瓶颈是什么.
什么是调试难以重现并发错误的一些技巧,例如每千次测试运行一次?我有其中一个,我不知道如何调试它.我无法在所有地方放置打印语句或调试器手表以观察内部状态,因为这会改变时间并在错误未成功复制时产生大量信息.
我正在尝试对一些极其性能关键的代码进行矢量化.在较高级别,每个循环迭代从小数组中的非连续位置读取六个浮点数,然后将这些值转换为双精度并将它们添加到六个不同的双精度累加器.这些累加器在迭代中是相同的,因此它们可以存在于寄存器中.由于算法的性质,使存储器访问模式连续是不可行的.尽管如此,该阵列足够小以适应L1缓存,因此内存延迟/带宽不是瓶颈.
我愿意使用汇编语言或SSE2内在函数来并行化.我知道我需要一次将两个浮点数加载到XMM寄存器的两个低位双字中,使用它们将它们转换为两个双精度数cvtps2pd,然后一次将它们添加到两个累加器中addpd.
我的问题是,如果它们在内存中彼此不相邻,如何将两个浮点数放入单个XMM寄存器的两个低位字中?显然,任何技术都是如此之慢以至于无法实现并行化的目的并没有用.ASM或英特尔/ GCC内在函数的答案将不胜感激.
编辑:
严格来说,浮点数组的大小在编译时是不知道的,但它几乎总是256,所以这可以是特殊的.
应该读取的float数组的元素是通过从字节数组加载值来确定的.有六个字节数组,每个累加器一个.来自字节数组的读取是顺序的,每个循环迭代的每个数组一个,因此不应该有很多缓存未命中.
浮点数组的访问模式是出于所有实际目的随机的.
d ×3
optimization ×3
performance ×3
assembly ×2
concurrency ×2
python ×2
algorithm ×1
c ×1
c++ ×1
conventions ×1
debugging ×1
file-io ×1
java ×1
jvm ×1
jython ×1
legacy ×1
locking ×1
low-level ×1
matrix ×1
montecarlo ×1
samba ×1
simd ×1
sse ×1
statistics ×1