我曾经在几个地方看到过推荐使用std::array在C ++中使用C风格的数组,声称这是一个更好,更安全的替代scheme,没有开销。 看到: 标准的容器数组没有超出它所需的元素的空间开销,[…]。 换句话说,它非常像一个没有问题的内置数组。 ( C ++ 11 FAQ ) 然而,据我所知,作为一个模板容器, 将会有一个开销,只要程序大小,因为它会生成代码为每个不同的Narrays是实例。 假设我的程序在不同的地方使用了std::array ,有N个不同的整数,这会导致代码臃肿吗? 这可以忽略不计吗? 我应该担心这一般的非types模板参数吗?
什么是.NET数组的内存布局? 拿这个数组为例: Int32[] x = new Int32[10]; 我明白,arrays的大部分是这样的: 0000111122223333444455556666777788889999 每个字符是一个字节,数字对应于数组中的索引。 另外,我知道所有对象都有一个types引用和一个同步块索引,所以上面可以调整为: ttttssss0000111122223333444455556666777788889999 ^ +- object reference points here 此外,数组的长度需要被存储,所以也许这是更正确的: ttttssssllll0000111122223333444455556666777788889999 ^ +- object reference points here 这是完整的吗? 数组中有更多的数据吗? 我问的原因是,我们正在试图估计一个相当大的数据语料库的几个不同的内存表示将会花费多less内存,并且数组的大小变化很大,所以开销可能有一个在一个解决scheme中产生了巨大的影响,但是在另一个解决scheme中可能没有那么多 所以基本上,对于一个数组来说,有多less开销,这基本上是我的问题。 而在arrays坏队伍醒来之前,解决scheme的这一部分是一个静态的一次构build一次引用的东西,所以使用可生成列表在这里是没有必要的。
在低水平测量经过时间时,我可以select使用以下任何一种: System.currentTimeMillis(); System.nanoTime(); 两种方法都是native实现的。 在挖掘任何C代码之前,有没有人知道是否有任何实质性的开销调用一个或另一个? 我的意思是,如果我真的不关心额外的精度,哪一个会花费更less的CPU时间? 注意:我正在使用标准的Java 1.6 JDK,但这个问题可能适用于任何JRE。
我读过使用C ++exception进行exception处理的开销,而不是检查返回值。 我只是谈论没有抛出exception时发生的开销。 我还假设你需要实现实际检查返回值的代码,并执行相应的操作,无论这些操作与catch块的操作相同。 而且,比较抛出exception对象和内部45个状态variables的代码到每个错误都返回一个负整数的代码也是不公平的。 我并不是试图为C ++exception构build一个案例,而仅仅基于哪一个可能执行得更快。 一旦你考虑了检查返回值和处理错误所需要的所有额外的簿记代码,我最近听说有人提出这样的例子:使用exception的代码应该和基于返回码的代码一样快。 我错过了什么?
很多文献谈到使用内联函数来“避免函数调用的开销”。 但是我还没有看到可以量化的数据。 函数调用的实际开销是多less?通过内联函数,我们达到了什么样的性能提升?
Java中有没有使用try / catch块的开销,而不是一个if块 (假设所附的代码否则不要求这样做)? 例如,对于string采取以下两个“安全修剪”方法的简单实现: public String tryTrim(String raw) { try { return raw.trim(); } catch (Exception e) { } return null; } public String ifTrim(String raw) { if (raw == null) { return null; } return raw.trim(); } 如果rawinput只是很less为null ,这两种方法之间是否存在性能差异 ? 此外,使用tryTrim()方法来简化代码布局是一个很好的编程模式 ,特别是通过在一个try / catch块中封装代码,可以避免很多if块检查罕见的错误情况? 例如,通常情况下,有一个N parameters的方法,如果任何这样的参数是“无效的”(例如空string或空string),则在其起点附近使用M <= N ,快速失败并确定性地执行。而不影响其余的代码。 在这种情况下, 如果块 ( k是每个参数的平均检查次数,例如k […]
它会假设任何差异的开销写一个导入加载一个包中的所有types( import java.* ); 不只是一个特定的types(即import java.lang.ClassLoader )? 第二个是比另一个更合适的使用方法吗?
简单的问题,但它一直唠叨我一会儿现在…. 什么是MySQL的“开销”,我应该担心吗? 不要点击“优化表”修复它的真实?
在使用数组的时候是否可以在可移植代码中实际使用新的位置? 看起来你从new []得到的指针并不总是和你通过的地址一样(5.3.4,标准中的注释12似乎证实了这是正确的),但是我不明白你如果是这样的话,可以为数组分配一个缓冲区。 以下示例显示了该问题。 用Visual Studio编译,这个例子导致内存损坏: #include <new> #include <stdio.h> class A { public: A() : data(0) {} virtual ~A() {} int data; }; int main() { const int NUMELEMENTS=20; char *pBuffer = new char[NUMELEMENTS*sizeof(A)]; A *pA = new(pBuffer) A[NUMELEMENTS]; // With VC++, pA will be four bytes higher than pBuffer printf("Buffer address: %x, Array […]
我试图使用这段代码来确定.NET数组(在一个32位进程中)头的开销: long bytes1 = GC.GetTotalMemory(false); object[] array = new object[10000]; for (int i = 0; i < 10000; i++) array[i] = new int[1]; long bytes2 = GC.GetTotalMemory(false); array[0] = null; // ensure no garbage collection before this point Console.WriteLine(bytes2 – bytes1); // Calculate array overhead in bytes by subtracting the size of // the array […]