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. csu1808

    csu1808 题意 n 个点间有 m 条地铁,每条地铁可能属于不同的线路,每条地铁有权值即通过时花费的时间,如果乘坐第 i 条地铁来到地铁站 s,再乘坐第 j 条地铁离开,需要花费额外的时间 \(| ...

  2. 线段树【p1115】 最大子段和

    题目描述-->p1115 最大子段和 虽然是一个普及-的题,但我敲了线段树 qwq 数组定义 \(lsum[ ]\)代表 该区间左端点开始的最大连续和. \(rsum[ ]\)代表 该区间右端点 ...

  3. 洛谷——P2862 [USACO06JAN]把牛Corral the Cows

    P2862 [USACO06JAN]把牛Corral the Cows 题目描述 Farmer John wishes to build a corral for his cows. Being fi ...

  4. 理解css的BFC

    BFC是CSS中一个看不见的盒子,(先理解CSS的盒子模型).它的页面渲染方式与普通流的盒子模型不同,它决定了其子元素将如何定位(所用属于BFC的box 都默认左对齐),以及和其他元素的关系和相互作用 ...

  5. [P2023][AHOI2009]维护序列(线段树)

    题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一 ...

  6. Android Developer -- Bluetooth篇 开发实例之三 管理连接

    Managing a Connection When you have successfully connected two (or more) devices, each one will have ...

  7. Ubuntu 16.04下ssh启用root登录

    debian里root账户默认没有密码,但账户锁定. 当需要root权限时, 直接执行 sudo su 即可切换为root用户. 重新开启root账号,在命令行下执行 sudo passwd root ...

  8. tq2440实验手册qt编译问题

    转载:http://blog.sina.com.cn/s/blog_6182b82201015ym1.html 编译qtopia最好使用的是低版本的gcc和g++. 举个简单的例子在qtopia的源代 ...

  9. Glide使用详解(一)

    一. 下载 在build.gradle中添加依赖: compile 'com.github.bumptech.glide:glide:3.7.0' 需要support-v4库的支持,如果你的项目没有s ...

  10. homebrew代理设置

    方法一 brew用curl下载,所以给curl挂上socks5的代理即可. 在~/.curlrc文件中输入代理地址即可. socks5 = "127.0.0.1:1080" 方法二 ...