关于C#数组初始化的效率测试

数组

最近我在写数据压缩的程序,经常用到数组。每到一定时候就需要对数组全部元素进行清零。由于C#不提供memset()方法。所以进行了以下的测试。

主要程序部份:

static void Main(string[] args)
{
int i,k;
double p = 0;
DateTime s, e;
byte[] test = new byte[65536];
byte[] test2 = new byte[65536];
for(int i = 0; i < 10; i++)
{
s = DateTime.Now;
for(j=0; j<50000; j++)
{
//***************//
}
e = DateTime.Now;
TimeSpan c = e - s;
Console.WriteLine(c.TotalMilliseconds.ToString());
p += c.TotalMilliseconds;
}

p /= 10;
Console.WriteLine("***" + p.ToString() + "***");
Console.Read();
}

将其中红色部份替换成以下几种方法:

1.test = new byte[65536];

这种方法显而易懂,每次都新建数组,里面的数值当然都是0啦。

2.memset(test,0,65536);

仿照C++自写一个memset函数:
public static void memset(byte[] buf, byte val, int size)
{
int i;
for(i=0; i < size; i++)
buf[i] = val;
}

3.for(k = 0; k < 65536; test[k++] = 0);
把函数memset直接写入红色部份。这样的想法很简单,节省调用函数的开销。

4.Array.Clear(test,0,65536);

直接使用.Net自带方法。

5.test2.CopyTo(test, 0);

用空数组向目标数组中复制内容。

然后理行测试,结果如下:

方法 最长 最短 平均

1 1937.5 1812.5 1842.1875

2 4593.75 4625 4584.375

3 6046.875 5984.375 6001.5625

4 562.5 640.5 581.25

5 812.5 750 770.3125

计算机:P43.0E(超线程开启)/DDR400 512M(双通道) 软件环境:Win XP - Sp2/VS2003 单位:毫秒(ms) 

结果很显然,Array.Clear()方法是最终的优胜者。但它有一个缺点,就是只可以将数组清空(零)。如果要把数组设置为某一特定格式CopyTo()以空间换时间的方式是最好的。
只有一点看不明白,把第2种函数调用改成第3种内嵌式算法后,效率反而下降了。这只能解释为编译器的优化了。看来用C#写程序不用太关心函数调用的开销。

时间: 2025-01-30 22:31:24

关于C#数组初始化的效率测试的相关文章

java byte 数组初始化效率问题

问题描述 java byte 数组初始化效率问题 有一段代码,每个30ms从jni得到一个byte数组(存储YUV420数据). 现在的问题是,以下两种做法,哪种效率更高些.设备对内存较为敏感. 在启动这段代码前,先分配一个预估大小的byte[]数组 在每次数据到来时,再去根据大小分配byte[]数组的大小 当然如果每次得到的数据大小接近,应该还是第一种方法好些. 所以我的问题也可以简化为: new byte[] 这种语句对效率的影响有多大呢? 拜谢各位大牛指教~. 解决方案 已研究过,结论如下

C#数组初始化的应用

C#数组初始化的应用在数据压缩方面的应用是什么呢?我们经常用到数组.每到一定 时候就需要对数组全部元素进行清零.由于C#不提供memset()方法.那么让我们尝试以下 的测试. C#数组初始化主要程序部份: static void Main(string[] args) { int i,k; double p = 0; DateTime s, e; byte[] test = new byte[65536]; byte[] test2 = new byte[65536]; for(int i =

C语言的数组学习入门之对数组初始化的操作_C 语言

数组在所有的语言中,以C最为简单,就是一起始地址,外加一数组的长度,而且基本上没有任何功能可言.然而,在所有的数组使用中,却是C的这种简单的数组形式,以其灵活性和效率,让人惊叹. C数组从逻辑上讲,是分形一致的(想不到其他词来形容了),分形的意思,就是部分与整体保持一致的构造形式,也即是数组的任何一部分也都是数组,比如一整型数组{1,2,3,4,5},连续取出其中任一连续的部分,都可以看成是一个数组,{2,3}是数组,{1,2,3}是数组,{4,5}也都是数组,差别只在于数组的起始地址和元素的个

java的数组初始化

在C中初始化数组极易出错,而且相当麻烦.C++通过"集合初始化"使其更安全(注释⑥).Java则没有象C++那样的"集合"概念,因为Java中的所有东西都是对象.但它确实有自己的数组,通过数组初始化来提供支持. 数组代表一系列对象或者基本数据类型,所有相同的类型都封装到一起--采用一个统一的标识符名称.数组的定义和使用是通过方括号索引运算符进行的([]).为定义一个数组,只需在类型名后简单地跟随一对空方括号即可: int[] al; 也可以将方括号置于标识符后面,获

指针-c语言中字符数组初始化问题

问题描述 c语言中字符数组初始化问题 字符数组初始化1: char str[]=""123"";//不报错2: char str[4]; str=""123"";//不能将const char[4] to char[4]字符指针初始化1: char *str=""123"";//不报错2: char *str; str=""123"";//不报错求

ASP写入响应流的最高效率测试结果

响应|响应 本篇教程主要介绍:将ASP生成的内容写入响应流中最有效的方法,即用 Response.Write 和 <%=%> 向客户端输出内容时的效率测试. 使用ASP的一个最主要原因是在服务器上生成动态内容.所以很明显,我们测试的起点是确定将动态内容发送到响应流中的最适合的方式. 在多种选择中,有两个是最基本的:一是使用内联ASP标记,另一个是使用Response.Write 语句. 为测试这些选择,我们创建了一个简单的ASP页面,其中定义了一些变量,然后将它们的值插入表格中.虽然这个页面很

java 二维字符串数组初始化及赋值问题

问题描述 java 二维字符串数组初始化及赋值问题 错误是"{ expected after token ; "请问为什么会出现这样的错误,该怎么解决? 解决方案 第一句话没错,第二句话,要放到具体的方法内,比如构造函数里,不要放到类一层的地方 解决方案二: 你确定有报错?我像这样写都没有报错! 解决方案三: java字符串数组初始化和赋值

C++对象数组初始化问题

问题描述 C++对象数组初始化问题 class A { public: A(const int a1):aa(a1) { } private: const int aa; }; class B { public: B(const int b1,const int b2,const int b1):aaa(a1) { } private: A aaa[3]; }; 请问A aaa[3];怎么初始化 解决方案 在构造函数中初始化,或者直接初始化 A aaa[3] = { A(1), A(2), A(

java 关于数组初始化的问题

问题描述 java 关于数组初始化的问题 为什么这里输出的是0 而不是 7 解决方案 一楼说的对,一般顺序为(这三者):变量,构造器,方法,当int n:系统默认n=0,所以初始化时b的长度等于0.我知道你想问的是:t.b.length,不是应该是通过t这个对象吗,但是数组一旦初始化长度就不能改了,所以导致打印输出时为0,懂了吧. 解决方案二: 因为一个对象初始化,他的成员变量要先于函数执行,构造函数也不例外,b是成员变量,初始化b的时候n还等于0 解决方案三: 你在成员变量和构造方法前都打个断