在典型的真实世界的程序中,内存分配/释放有多大的瓶颈?任何类型的程序通常都很重要的答案是受欢迎的.malloc/free/garbage收集的正确实现是否足够快,以至于它只是少数极端情况下的瓶颈,或者大多数性能关键型软件都会从尝试保持内存分配量下降或拥有更快的malloc/free /中获益匪浅垃圾收集实施?
注意:我不是在谈论实时的东西.对性能至关重要,我的意思是吞吐量很重要,但延迟并不一定.
编辑:虽然我提到了malloc,但这个问题不是针对C/C++的.
malloc optimization performance garbage-collection memory-management
我从来没有写过TDD代码,但我在SO上已经看过很多关于它的讨论.我最担心的是,似乎一般良好的API设计(灵活性,易用性,界面简洁性和性能)有时会使代码可模仿,超模块超出任何API使用所需的范围例如,TDD支持者经常建议将事物作为参数传递,从API抽象的角度来看,被调用的方法应该"只知道",或者以一种使测试变得简单的方式考虑类和方法,这不一定是最能与问题领域相关的方式.
对于TDD和API设计更有经验的人:您是否发现TDD经常妨碍良好的API设计?如果是这样,你怎么反击这个?
在使用Python编程时,是否可以为将填充已知数量的项目的列表保留内存,以便在构建列表时不会多次重新分配列表?我查看了文档中的Python列表类型,但没有找到任何似乎这样做的东西.但是,这种类型的列表构建显示在我的代码的几个热点中,所以我想尽可能高效.
编辑:另外,用像Python这样的语言做这样的事情是否有意义?我是一个相当有经验的程序员,但是对Python很陌生并且仍然对它的做事方式有所了解.Python是否在内部将所有对象分配到单独的堆空间中,从而无法尝试最小化分配,或者是直接存储在列表中的诸如整数,浮点数等原语?
我正在开发一个我希望在许可许可下发布的开源项目,因为它是一个库,而不是一个应用程序,而且就个人而言,我不喜欢copyleft的库代码.如果我浏览用不同编程语言编写的GPL代码只是为了大致了解如何做某事,然后用我正在使用的语言编写一个类似或相同算法的不同实现,那么可能会是什么后果?如果我的代码与他们的代码有些相似,并且明显受到他们的影响,那么copyleft所有者会有任何合理的投诉吗?这些灰色区域通常如何工作?
使用new,malloc等动态内存分配的时间复杂度是多少?我对内存分配器的实现方式知之甚少,但我认为答案是它取决于实现.因此,请回答一些更常见的案例/实施.
编辑:我依稀记得在最坏的情况下听到堆分配是无限的,但我真的对平均/典型情况感兴趣.
我正在为D编程语言开发一个自定义标记释放样式的内存分配器,它通过从线程局部区域分配来工作.似乎线程本地存储瓶颈导致从这些区域分配内存的巨大(~50%)减速与相同的单线程版本的代码相比,即使在设计我的代码以使每个分配只有一个TLS查找/释放.这是基于在循环中多次分配/释放内存,我试图弄清楚它是否是我的基准测试方法的工件.我的理解是线程本地存储基本上只需要通过额外的间接层访问某些东西,类似于通过指针访问变量.这是不正确的?线程本地存储通常有多少开销?
注意:虽然我提到D,但我也对D不具体的一般答案感兴趣,因为如果它比最佳实现慢,D的线程局部存储的实现可能会有所改进.
从程序员的角度来看,GPGPU与常规多核/多线程CPU编程之间的关键实际区别是什么?特别:
什么类型的问题更适合常规多核以及哪种类型更适合GPGPU?
编程模型的主要区别是什么?
什么是关键的底层硬件差异,需要编程模型的任何差异?
哪一个通常更容易使用,多少?
从长远来看,为GPU实现高级并行库是否切实可行,例如Microsoft的任务并行库或D的std.parallelism?
如果GPU计算效率非常高,为什么CPU的设计更像GPU?
parallel-processing performance multithreading multicore gpgpu
我经常听到人们说C不执行尾部呼叫消除.虽然标准不能保证,但是无论如何,它是否在实践中通过任何体面的实现来执行?假设你只针对成熟的,实现良好的编译器而不关心为模糊平台编写的原始编译器的绝对最大可移植性,那么在C中依赖尾调用是否合理呢?
另外,将尾部呼叫优化留在标准之外的理由是什么?
在处理小项目时,您认为将数据存储在简单文本文件,哈希表等中的收支平衡点与使用真实数据库相比如何?对于具有简单数据管理要求的小型项目,真正的数据库是不必要的复杂性并且违反了YAGNI.但是,在某些时候,数据库的复杂性显然是值得的.有什么迹象表明你的问题对于简单的ad-hoc技术来说过于复杂并且需要真正的数据库?
注意:对于习惯于企业环境的人来说,这可能听起来像一个奇怪的问题.但是,我的问题领域是生物信息学.我的大多数编程都是原型,而不是生产代码.我主要是域专家,其次是程序员.我的大多数代码都是以算法为中心的,而不是以数据管理为中心的.这个问题的目的主要是让我弄清楚如果我学会在我的代码中使用正确的数据库而不是我通常使用的更多临时技术,我可以节省多少工作.
我正在优化数值/统计库的排序函数,基于这样的假设:在过滤掉任何NaN并进行一些微调之后,可以将浮点数作为32位整数进行比较而不改变结果,并且可以将双精度数据进行比较64位整数.
这似乎加速了这些数组的排序大约40%,并且只要浮点数的位级表示是IEEE 754,我的假设就成立.是否存在人们实际使用的真实CPU(不包括在嵌入式设备中,这个库没有针对哪个)使用其他可能会破坏这种假设的表示?
float在使用IEEE754的系统中)double在使用IEEE754的系统中)