C#中使用泛型对照使用通用基础类型效率减少近一倍

以下是測试结果:

CSharp class and generic TotalMilliseconds: 270772.9229
CSharp generic TotalMilliseconds: 269963.3999
CSharp normal TotalMilliseconds: 159716.9094

測试代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace ConsoleApplication1
{
class Program
{
static class InsertionSort<T> where T : IComparable
{
public static void Sort(T[] a)
{
for (var i = 0 + 1; i <= a.Length - 1; i++)
{
var tmp = a[i];
int j = i; while (j > 0 && a[j - 1].CompareTo(tmp) > 0)
a[j] = a[--j]; a[j] = tmp;
}
}
} public static void CSharpInsertionSortGeneric<T>(T[] a) where T : IComparable
{
for (var i = 0 + 1; i <= a.Length - 1; i++)
{
var tmp = a[i];
int j = i; while (j > 0 && a[j - 1].CompareTo(tmp) > 0)
a[j] = a[--j]; a[j] = tmp;
}
} public static void CSharpInsertionSort(int[] a)
{
for (var i = 0 + 1; i <= a.Length - 1; i++)
{
var tmp = a[i];
int j = i; while (j > 0 && a[j - 1].CompareTo(tmp) > 0)
a[j] = a[--j]; a[j] = tmp;
}
} static void Main(string[] args)
{
DateTime start = DateTime.Now;
int[] a = new int[200000];
for (int i = 0; i < 200000; i++)
{
a[i] = 100 - i;
}
InsertionSort<int>.Sort(a);
DateTime end = DateTime.Now;
Console.WriteLine(string.Format("CSharp class and generic TotalMilliseconds: {0}", (end - start).TotalMilliseconds)); int[] a2 = new int[200000];
for (int i = 0; i < 200000; i++)
{
a2[i] = 100 - i;
}
CSharpInsertionSortGeneric(a2);
DateTime end2 = DateTime.Now;
Console.WriteLine(string.Format("CSharp generic TotalMilliseconds: {0}", (end2 - end).TotalMilliseconds)); int[] a3 = new int[200000];
for (int i = 0; i < 200000; i++)
{
a3[i] = 100 - i;
}
CSharpInsertionSort(a3);
DateTime end3 = DateTime.Now;
Console.WriteLine(string.Format("CSharp normal TotalMilliseconds: {0}", (end3 - end2).TotalMilliseconds)); //Console.WriteLine(String.Join(" ", a));
Console.ReadKey();
}
}
}

非常显然,泛型减少了效率但提高了灵活性。

可是从MSDN上https://msdn.microsoft.com/en-us/library/ms172192.aspx 看到泛型有个有长处:

Better performance. Generic collection types generally perform better for storing and manipulating value types because there is no need to box the value types.

性能非常好?非常怀疑这不是每种情况下都是性能非常好。为什么会这样?可能是执行时泛型会做很多其它的内存操作由此产生了效率的减少。

C#中使用泛型对照使用通用基础类型效率减少近一倍的更多相关文章

  1. Swift 4 中的泛型

    作为Swift中最重要的特性之一,泛型使用起来很巧妙.很多人都不太能理解并使用泛型,特别是应用开发者.泛型最适合libraries, frameworks, and SDKs的开发.在这篇文章中,我将 ...

  2. Java开发知识之Java中的泛型

    Java开发知识之Java中的泛型 一丶简介什么是泛型. 泛型就是指泛指任何数据类型. 就是把数据类型用泛型替代了. 这样是可以的. 二丶Java中的泛型 Java中,所有类的父类都是Object类. ...

  3. 玩转JavaScript OOP[0]——基础类型

    前言 long long ago,大家普遍地认为JavaScript就是做一些网页特效的.处理一些事件的.我身边有一些老顽固的.NET程序员仍然停留在这种认知上,他们觉得没有后端开发肯定是构建不了系统 ...

  4. 夯实Java基础系列13:深入理解Java中的泛型

    目录 泛型概述 一个栗子 特性 泛型的使用方式 泛型类 泛型接口 泛型通配符 泛型方法 泛型方法的基本用法 类中的泛型方法 泛型方法与可变参数 静态方法与泛型 泛型方法总结 泛型上下边界 泛型常见面试 ...

  5. Java基础之Java中的泛型

    1.为什么要使用泛型 这里我们俩看一段代码; List list = new ArrayList(); list.add("CSDN_SEU_Cavin"); list.add(1 ...

  6. 窥探Swift之使用Web浏览器编译Swift代码以及Swift中的泛型

    有的小伙伴会问:博主,没有Mac怎么学Swift语言呢,我想学Swift,但前提得买个Mac.非也,非也.如果你想了解或者初步学习Swift语言的话,你可以登录这个网站:http://swiftstu ...

  7. 转载:C#中的泛型

    泛型(generic)是C#语言2.0和通用语言运行时(CLR)的一个新特性.泛型为.NET框架引入了类型参数(type parameters)的概念.类型参数使得设计类和方法时,不必确定一个或多个具 ...

  8. C#中的泛型 【转】

    C#中的泛型 泛型(generic)是C#语言2.0和通用语言运行时(CLR)的一个新特性.泛型为.NET框架引入了类型参数(type parameters)的概念.类型参数使得设计类和方法时,不必确 ...

  9. C#中的泛型详解

    泛型(generic)是C#语言2.0和通用语言运行时(CLR)的一个新特性.泛型为.NET框架引入了类型参数(type parameters)的概念.类型参数使得设计类和方法时,不必确定一个或多个具 ...

随机推荐

  1. [python] win7 64位 安装pygame

    1.下载pygame 2.python 下载3.2.*  32位的(电脑64位没关系的) 3.先安装python,再安装pygame 4.验证是否成功 打开IDLE >>>impor ...

  2. 51nod 1133 不重叠的线段【贪心/区间覆盖】

    1133 不重叠的线段 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 X轴上有N条线段,每条线段有1个起点S和终点E.最多能够选出多少条互不重叠的 ...

  3. uvalive4108(线段树)

    uvalive4108 题意 按顺序给出 n 个矩形,每给出一个矩形,统计它在多长的部分是最高的,并把这个长度称为该矩形的覆盖度,求最后总的覆盖度(每次得到的矩形的覆盖度之和) 分析 线段树.用两个数 ...

  4. Strobogrammatic Number II -- LeetCode

    A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at upside ...

  5. APIO2018练习赛伪题解

    传送门:https://pcms.university.innopolis.ru/statements/org/apio/2018/practice/statements.pdf 主要就在于后面三道构 ...

  6. HDU 4815 Little Tiger vs. Deep Monkey 2013 长春现场赛C题

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4815 [题意] n个题目,每题有各自的分数,A有50%的概率答对一道题目得到相应分数,B想要在至少P的概率 ...

  7. C语言基础之for循环的使用

    一.for循环格式. 1: for (语句1; 条件; 语句2) 2:   3: { 4:   5: 循环体 6:   7: } 8:   9: 具体: 10:   11: 语句1:初始化语句 12: ...

  8. 什么是IIS并发连接数

    http://blog.csdn.net/leftfist/article/details/38407223  https://wk.baidu.com/view/2962d073f242336c1e ...

  9. 如何使用Delphi编写Modbus RTU CRC16的校验码

    在工业控制中,Modbus RTU CRC16的校验码用的比较广泛,包括本人富士产品中,PC与伺服电机以及PC与VP系列的变频器的Modbus RTU通讯中都使用到了CRC16.     而对CRC1 ...

  10. 【Linux】CentOS7上安装JDK 和卸载 JDK 【rpm命令的使用】

    之前有过一篇在CentOS7上安装JDK的文章:http://www.cnblogs.com/sxdcgaq8080/p/7492426.html 在这里又说一次,是要使用rpm命令安装JDK的rpm ...