当前位置:  编程技术>.net/c#/asp.net
本页文章导读:
    ▪新闻站点程序      又帮朋友完成一个小新闻站点,还是Visual Basic.NET的asp.net程序。.NET Framework 4.0数据库SQL 2008 R2它有后管理,默认的帐号为sa, 密码为12345678,可以更改密码,但默认管理员帐号不可更改,但可以.........
    ▪委托与实践      分类索引:C# 语言和运行时剖析--前言元旦休假了一段时间,所以没有更新,现在开始恢复更新,一周一到两章。之前的章节在知识点的组织结构上更多参考了《CLR Via C#》这本书。从这章开始.........
    ▪在开发中你可能没有考虑到的两个性能优化      1:多余的存储引用导致性能降低;2:利用局部性提高程序性能;先来说说引用是怎么降低程序性能,个人认为降低程序性能主要有两个原因,一是数据结构选择不合理,二是多层嵌套循环导.........

[1]新闻站点程序
    来源:    发布时间: 2013-10-28

又帮朋友完成一个小新闻站点,还是Visual Basic.NET的asp.net程序。.NET Framework 4.0数据库SQL 2008 R2

它有后管理,默认的帐号为sa, 密码为12345678,可以更改密码,但默认管理员帐号不可更改,但可以添加另外管理员帐户。

新闻管理,它使用CuteEditor_for_NET6文本编辑器。当然新闻的添加编辑以及删除功能一应具全。

ASP连接数据库,请参考web.config语句。

程序中有几好个用户控件,参考如下:

 

 首页有可播放 Flash(.swf),有多屏图片切换,简单的导航条,你均可以定制它。

数据库在源程序压缩包内的DB目录。

源程序下载:http://download.cnblogs.com/insus/Project/Nedu.rar

 

本文链接


    
[2]委托与实践
    来源:    发布时间: 2013-10-28

分类索引:C# 语言和运行时剖析--前言

元旦休假了一段时间,所以没有更新,现在开始恢复更新,一周一到两章。

之前的章节在知识点的组织结构上更多参考了《CLR Via C#》这本书。从这章开始,打算脱离这本书的章节结构,来完全讲一些自己的总结。不过在代码实例上还是会引用这本书的案例。

委托的概念

一.定义:委托是一种封装方法的类型, 通过委托可以调用方法,相当于C/C++中函数指针的概念. 但不同的是,委托不光是一个函数地址, 而是一个面向对象的类型. 其中封装了指向对象的实例和方法。

 

二.要点:委托相对于其他类型来说相对抽象,因为其中有很多特殊的封装。

  • 使用委托时,不能用delegate来定义一个实例,而必须先使用delegate来定义一个新的类型(真正使用的委托类型),这个类型提供了委托所需要指向的方法的模板.然后用这个自定义类型再申明实例使用。
  • 委托的实例不仅封装了一个方法的引用,而且可以形成委托链,对聚合的多个方法进行链式调用。
  • FCL提供了多个已封装的常用委托类型,如Action, Func, EventHandler等,善于利用这些已封装的委托类型,特别是泛型委托,可以实现更好的设计。
  • 委托虽然是封装方法调用的类型,但他可以作为其他方法的参数以及局部变量被调用,这也是一个较难理解的知识点。
  • 委托有多种调用方式,在.NET 3.0之后的版本,可以使用Lambda表达式来编码较为简单的委托封装。
  • 委托可以封装其他类型的实例方法,也可以封装静态方法。
  •  

    三.代码示例

    internal sealed class DelegateIntro {
    //申明一个委托类型;此类型的实例指向一个采用Int32参数,以及返回void的方法
    internal delegate void Feedback(Int32 value);

    public static void Go() {
    StaticDelegateDemo();
    InstanceDelegateDemo();
    ChainDelegateDemo1(new DelegateIntro());
    ChainDelegateDemo2(new DelegateIntro());
    }

    /// <summary>
    /// 静态方法封装
    /// </summary>
    private static void StaticDelegateDemo() {
    Console.WriteLine("----- Static Delegate Demo -----");
    Counter(1, 3, null);
    Counter(1, 3, new Feedback(DelegateIntro.FeedbackToConsole));
    Counter(1, 3, new Feedback(FeedbackToMsgBox)); // "Program." is optional
    Console.WriteLine();
    }

    /// <summary>
    /// 实例方法封装
    /// </summary>
    private static void InstanceDelegateDemo() {
    Console.WriteLine("----- Instance Delegate Demo -----");
    DelegateIntro di = new DelegateIntro();
    Counter(1, 3, new Feedback(di.FeedbackToFile));

    Console.WriteLine();
    }

    /// <summary>
    /// 委托链实例一
    /// </summary>
    /// <param name="di"></param>
    private static void ChainDelegateDemo1(DelegateIntro di) {
    Console.WriteLine("----- Chain Delegate Demo 1 -----");
    Feedback fb1 = new Feedback(FeedbackToConsole);
    Feedback fb2 = new Feedback(FeedbackToMsgBox);
    Feedback fb3 = new Feedback(di.FeedbackToFile);

    Feedback fbChain = null;
    fbChain = (Feedback)Delegate.Combine(fbChain, fb1);
    fbChain = (Feedback)Delegate.Combine(fbChain, fb2);
    fbChain = (Feedback)Delegate.Combine(fbChain, fb3);
    Counter(1, 2, fbChain);

    Console.WriteLine();
    fbChain = (Feedback)Delegate.Remove(fbChain, new Feedback(FeedbackToMsgBox));
    Counter(1, 2, fbChain);
    }

    /// <summary>
    /// 委托链示例2
    /// </summary>
    /// <param name="di"></param>
    private static void ChainDelegateDemo2(DelegateIntro di) {
    Console.WriteLine("----- Chain Delegate Demo 2 -----");
    Feedback fb1 = new Feedback(FeedbackToConsole);
    Feedback fb2 = new Feedback(FeedbackToMsgBox);
    Feedback fb3 = new Feedback(di.FeedbackToFile);

    Feedback fbChain = null;
    fbChain += fb1;

        
    [3]在开发中你可能没有考虑到的两个性能优化
        来源:    发布时间: 2013-10-28

    1:多余的存储引用导致性能降低;

    2:利用局部性提高程序性能;

    先来说说引用是怎么降低程序性能,个人认为降低程序性能主要有两个原因,一是数据结构选择不合理,二是多层嵌套循环导致部分代码被多余重复执行。在第二种情况下我们一般都是优化循环最里层的代码,能提出来的尽量往外层提,实在不行的就优化它的运行速度。

    1:多余的存储引用导致性能降低。先来看一个关于引用导致性能降低的问题。下面两个方法哪个更快。

    static void Test2(ref int sum)
    {
    for (int i = 1; i <= timer; i++)
    {
    sum += i;
    }
    }

    static void Test3(ref int sum)
    {
    int tmpSum = sum;
    for (int i = 1; i <= timer; i++)
    {
    tmpSum += i;
    }
    sum = tmpSum;
    }

    大致一看他们的性能应该没有差别,因为这两个方法其实就是利用一个循环求和,而真正能影响方法的性能就是这个循环,且两个方法的循环表面上看可以说是一样的,当,我令timer=10000000时,即求1+2+...+10000000的和,方法Test3的速度比Test2快。是的,Test3比Test2快,在某个区间内timer越大,性能差别越大。运行结构如下:

    咱们直接来看反汇编代码,部分反汇编代码如下,我们只用看红线框着的部分。

     

    最主要的一句代码:sum+=i;方法Test2比方法Test3多了最后面一行,即将每次循环后求得的和回写到内存中,方法Test3却不用这么麻烦,只用一个寄存器,每次求得的和写到寄存器中,求完和后一次将和写到内存中。在每次循环中,Test2要读两次内存(sum和i都从内存中读),写一次内存(将求得的和写到内存中),而方法Test3只需要读一次内存,即从内存中读i的值,方法Test3的性能比Test2高就不言而喻了。就因为Test2每次都是以引用的方式读sum的值,CPU要得到sum的值,就得通过sum在内存中的地址,所以必读内存,,而Test3不必读内存,用一个寄存器即可。

     

    2:利用局部性提高程序性能。还是直接看一个简单的例子

    static int Test4(int[,] arr, int row, int column)
    {
    int sum = 0;
    for (int i = 0; i < row; i++)
    {
    for (int j = 0; j < column; j++)
    {
    sum += arr[i, j];
    }
    }
    return sum;
    }

    static int Test5(int[,] arr, int row, int column)
    {
    int sum = 0;
    for (int j = 0; j < column; j++)
    {
    for (int i = 0; i < row; i++)
    {
    sum += arr[i, j];
    }
    }
    return sum;
    }

    简单一个看,两个方法几乎是完全一样,不同的是Test4是按行求和,而Test5是按列求和。如果多次执行这两个方法进行,对比就会方法Test4的性能高于Test5。运行两个方法100000次,结果如下:

    为什么按行求和比按列求和快呢?简单一句话:数组是按行存的。CPU每次从内存读数据,不是要哪个就读哪个就直接读哪个,而是每次读一个高速缓存行,就是每次要多读一些,如,果需要的数据在高速缓存行中,就不用到内存中去读了,而是直接从高速缓存行中取,当然就比再从内存中读取要快一些。而在这里,数组按行存储,也就是说,CPU每次会读多个数组元素导高速缓存行,如果需要的元素在高速缓存行中就不用到内存中去取了,这就是传说中的命中率,按行求和命中率当然就高了。而按列求和,命中率自然低,CPU每次将一行中的多个元素读到高速缓存行中,按列求和每次只需要一个元素,也就是每次只需要一个元素而CPU却读了多个元素,命中率当然低,低到可能出现命中率为0。

    程序的局部性包括:空间局部性和时间局部性,这里说的就是空间局部性。

    空间局部性就是说一个被使用的到数据其周围的数据很可能会被马上使用。

    时间局部性就是说一个被使用的到数据很可能会被再次使用。

    更多内容请看《深入理解操作系统》。

    作者:陈太汉

    博客:http://www.cnblogs.com/hlxs/

    本文链接


        
    最新技术文章:
    ▪C#通过IComparable实现ListT.sort()排序
    ▪C#实现对Json字符串处理实例
    ▪Winform实现抓取web页面内容的方法
    ▪Winform实现将网页生成图片的方法
    ▪C#控制台程序中处理2个关闭事件的代码实例
    ▪WinForm实现同时让两个窗体有激活效果的特效...
    ▪WinForm实现拦截窗体上各个部位的点击特效实...
    ▪用C#的params关键字实现方法形参个数可变示例
    ▪C#判断某程序是否运行的方法
    ▪C#验证码识别基础方法实例分析
    ▪C#通过WIN32 API实现嵌入程序窗体
    ▪C#实现获取鼠标句柄的方法
    ▪C#事件处理和委托event delegate实例简述
    ▪C#获取程序文件相关信息的方法
    ▪C#中的除法运算符与VB.NET中的除法运算符
    ▪ASP.NET MVC 5使用X.PagedList.Mvc进行分页教程(PagedLi...
    ▪Base64编码解码原理及C#编程实例
    ▪C#实现的优酷真实视频地址解析功能(2014新算...
    ▪C#和SQL实现的字符串相似度计算代码分享
    ▪C#使用Word中的内置对话框实例
    ▪C#反射之基础应用实例总结
    ▪C#生成单页静态页简单实例
    ▪C#实现SMTP邮件发送程序实例
    ▪C#实现随鼠标移动窗体实例
    ▪C#使用GDI+创建缩略图实例
    ▪C#实现通过模板自动创建Word文档的方法
    ▪C#中Response.Write常见问题汇总
    ▪C#中多态、重载、重写区别分析
    ▪WinFrom中label背景透明的实现方法
    ▪C#中out保留字用法实例分析
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3