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 = 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#写程序不用太关心函数调用的开销。

C#数组初始化的应用的相关实例应用就向你讲解到这里,希望对你有所帮助。

时间: 2025-01-21 08:12:58

C#数组初始化的应用的相关文章

指针-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"";//不报错求

java的数组初始化

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

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 解决方案三: 你在成员变量和构造方法前都打个断

java byte 数组初始化效率问题

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

c语言-C语言二位数组初始化的问题

问题描述 C语言二位数组初始化的问题 我这有一本书上的解释里面int b[][4]={{0,0,3},{},{0,10}};是正确的,但是习题里面这个int b[][3]={{1,2,3},{},{4,5}};就是错误的:在vc6.0里面输入是前面的是错的,后面的是对的,我想确定下到底哪个是对的.初始化的时候花括号中可以社么都不写吗?谢谢了! 解决方案 可能是编译器的问题吧,在vs2010中以上两种赋值都是正确的. 初始化的时候花括号中什么都不写 例如: int b[][4] = {}; //也

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

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

c#-C#中数组初始化后赋值问题

问题描述 C#中数组初始化后赋值问题 C#中数组已经如下初始化后: int [] myIntArray={0,1,2,3,4}; 是不是上述语句后面,不允许再用如下语句: myIntArray={5,9,10,2,99}; 解决方案 myIntArray={5,9,10,2,99}; 这种语法,只有数组定义时初始化可以使用. 后续的只能按下标一个个的赋值,当然你可以用循环来赋值数组中的每一个元素. 解决方案二: 是的,数组初始化后,不能再显示的赋值. 解决方案三: myIntArray={5,9