当前位置:编程学习 > C#/ASP.NET >>

实例化类的性能问题



为了方便,把几个通用方法写在一个类内:
public class ComUtils
{
   //很多很多的方法
}
现在页面Page1,需要用到ComUtils,于是new ComUtils()实例化下,
Page1处理过程中还需要调用另一个类Page2,也实例化了new Page2,Page2也需要用到ComUtils
Page2处理过程中也需要调用另一个类Page3,也实例化了new Page3,Page3也需要用到ComUtils
Page2  Page3 都是方便其他页面的调用的,所以就不写在Page1里
因为请求量大,考虑线程问题,所以ComUtils是不要静态调用的
那么,是否这3个cs内都要使用到ComUtils,都需要分别进行一次new ComUtils()吗?
因为ComUtils代码不少这样会不会太耗性能了,求好方法~~


--------------------编程问答-------------------- 实例化时只调用构造函数和初始化类变量,
代码多不要紧,只要构造函数没代码就可以了。

--------------------编程问答--------------------
引用 楼主 seandro 的回复:
为了方便,把几个通用方法写在一个类内:
public class ComUtils
{
   //很多很多的方法
}
现在页面Page1,需要用到ComUtils,于是new ComUtils()实例化下,
Page1处理过程中还需要调用另一个类Page2,也实例化了new Page2,Page2也需要用到ComUtils
Page2处理过程中也需要调用另一个类Page3,也实例化了new Page3,Page3也需要用到ComUtils
Page2  Page3 都是方便其他页面的调用的,所以就不写在Page1里
因为请求量大,考虑线程问题,所以ComUtils是不要静态调用的
那么,是否这3个cs内都要使用到ComUtils,都需要分别进行一次new ComUtils()吗?
因为ComUtils代码不少这样会不会太耗性能了,求好方法~~

为什么不写成静态的? --------------------编程问答--------------------
引用 2 楼 rui_china 的回复:
Quote: 引用 楼主 seandro 的回复:



为了方便,把几个通用方法写在一个类内:
public class ComUtils
{
   //很多很多的方法
}
现在页面Page1,需要用到ComUtils,于是new ComUtils()实例化下,
Page1处理过程中还需要调用另一个类Page2,也实例化了new Page2,Page2也需要用到ComUtils
Page2处理过程中也需要调用另一个类Page3,也实例化了new Page3,Page3也需要用到ComUtils
Page2  Page3 都是方便其他页面的调用的,所以就不写在Page1里
因为请求量大,考虑线程问题,所以ComUtils是不要静态调用的
那么,是否这3个cs内都要使用到ComUtils,都需要分别进行一次new ComUtils()吗?
因为ComUtils代码不少这样会不会太耗性能了,求好方法~~

为什么不写成静态的?

线程问题,并发大,会出问题 --------------------编程问答--------------------
引用 3 楼 seandro 的回复:
Quote: 引用 2 楼 rui_china 的回复:

Quote: 引用 楼主 seandro 的回复:



为了方便,把几个通用方法写在一个类内:
public class ComUtils
{
   //很多很多的方法
}
现在页面Page1,需要用到ComUtils,于是new ComUtils()实例化下,
Page1处理过程中还需要调用另一个类Page2,也实例化了new Page2,Page2也需要用到ComUtils
Page2处理过程中也需要调用另一个类Page3,也实例化了new Page3,Page3也需要用到ComUtils
Page2  Page3 都是方便其他页面的调用的,所以就不写在Page1里
因为请求量大,考虑线程问题,所以ComUtils是不要静态调用的
那么,是否这3个cs内都要使用到ComUtils,都需要分别进行一次new ComUtils()吗?
因为ComUtils代码不少这样会不会太耗性能了,求好方法~~

为什么不写成静态的?

线程问题,并发大,会出问题

如果仅仅只是实现一个独立的功能模块,一般不会有什么问题 --------------------编程问答-------------------- 比如一个获取客户端IP的方法,请求并发量非常大的前提下你们会写静态的还是实例化的呢? --------------------编程问答-------------------- 耗多少“性能”你自己写一个测试算算能让你让你的程序界面的用户体验慢几分之一秒就行了。

真正的设计是考虑更有价值的东西的,这种事情上不需要求别人给自己决定。 --------------------编程问答--------------------
引用 5 楼 seandro 的回复:
比如一个获取客户端IP的方法,请求并发量非常大的前提下你们会写静态的还是实例化的呢?


随便。 --------------------编程问答-------------------- 如果你不用成员变量就应该用静态方法。 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 性能肯定是有影响的。
实例化三次,CLR就会在托管堆中分别配三块内存,存放ComUtils的实例字段(包括基类实例字段)还有类型对象指针和同步块索引。
同时CLR还会在托管堆中创建ComUtils的类型对象,类型对象里面存放的是ComUtils的对象方法和静态方法以及类型对象指针和同步块索引,但是类型对象只会创建一次,在调用方法前CLR就会检查你的代码,如果托管堆存在一个ComUtils的类型对象,那就不会再创建,ComUtils的实例对象的类型对象指针就会指向名为ComUtils的类型对象,所以三个对象实例指向的是同一个类型对象。

根据你的需求优化代码,比如单例模式. --------------------编程问答-------------------- 并发问题?你 new 三次 ComUtils 对象,难道他们中间有什么全局字段会被修改?既然并发,那么 ComUtils 就应该设计成静态的,对于非静态的那部分,我觉得应该提取出来另外构造一个轻量级的类或者结构。 --------------------编程问答-------------------- ?????????

我想你一定在博客园看过很多很多误人子弟的所谓分享,所谓总结,所谓优化

那么做为一线编程人员,我可以负责滴说,那些总结,分享,优化基本没有任何价值。过早优化是软件编写的绝对禁区。

另外你自己说了是通用类,而且与实例环境无关,全是方法。那么为啥不是静态类呢。至于线程并发??没有任何证据证明静态api类和线程有啥关系。博客园上所谓的有关系只的是什么?指的是全局静态的List<T>这种非线程安全的全局静态变量有问题,但绝对不是你这种纯静态api有问题(博客园毛病就是喜欢夸大,非线程安全的静态变量有毛病,总结出来就夸大成了静态和线程有毛病) --------------------编程问答--------------------
引用 13 楼 wanghui0380 的回复:

晕了,请问以下的代码是否适合放在静态内

public class ComUtils
{
    public static string GetCookieStr(string s)//获得cookie值
    {
        HttpCookie c = HttpContext.Current.Request.Cookies[s];
        return c == null ? "" : c.Value;
    }
    public static string GetMd5(string s)//获得md5密文
    {
        MD5 md5 = new MD5();//实例
        return string.IsNullOrEmpty(s) ? "" : md5.GetMD5(s);
    }
    public static string GetReferrer//获得UrlReferrer
    {
        get
        {
            Uri Uri = HttpContext.Current.Request.UrlReferrer;
            return Uri == null ? "" : Uri.Host.ToString();
        }
    }
    public static string GetUrlTokenDecode(string s)//获得UrlTokenDecode
    {
        try
        {
            return string.IsNullOrEmpty(s) ? "" : Encoding.Default.GetString(HttpServerUtility.UrlTokenDecode(s));
        }
        catch { log4net.Error("GetTokenDecode, s=" + s); return ""; }
    }
}
--------------------编程问答-------------------- 特别是获得md5密文这个方法,还引用了新实例 --------------------编程问答-------------------- 基本上,是PageN中单个实例化ComUtils,还是作为一个参数允许传入,还是使用一个Static的Get方法来获取,还是干脆把ComUtils的所有方法变为static的,这更多地是一个“个人爱好”问题。

在实际开发中,所有变化的情况都会遇到,谁也不能免俗。不可能因为我们“洁癖”了于是就不会遇到这种情况。因为我们从事的设计工作,而不是装卸工的工作,因此我们一定会亲自面对这种问题。

这个时候,容忍一点瑕疵,你可以有足够闲工夫时就非常高兴地去去把这个ComUtils类型定义变来变去地(并且重构原来代码中的几百处相关代码),但是不要因这种纠结而把自己弄得身心疲惫。

我要强调和注意的仅仅是:这并太不关什么“性能”的事情,主要是个人爱好问题。 --------------------编程问答-------------------- 在软件设计中,我们当然要少定义一些class,少写一些代码,这是不变的。

但是我们之所以要定义class,一定是有原因的。那么既然已经定义了,现在你又想“弄回来”,不用太着急。 --------------------编程问答--------------------
引用 17 楼 sp1234 的回复:
在软件设计中,我们当然要少定义一些class,少写一些代码,这是不变的。

但是我们之所以要定义class,一定是有原因的。那么既然已经定义了,现在你又想“弄回来”,不用太着急。

能帮忙看下13楼的问题吗 --------------------编程问答--------------------
引用 14 楼 seandro 的回复:
Quote: 引用 13 楼 wanghui0380 的回复:

晕了,请问以下的代码是否适合放在静态内

public class ComUtils
{
    public static string GetCookieStr(string s)//获得cookie值
    {
        HttpCookie c = HttpContext.Current.Request.Cookies[s];
        return c == null ? "" : c.Value;
    }
    public static string GetMd5(string s)//获得md5密文
    {
        MD5 md5 = new MD5();//实例
        return string.IsNullOrEmpty(s) ? "" : md5.GetMD5(s);
    }
    public static string GetReferrer//获得UrlReferrer
    {
        get
        {
            Uri Uri = HttpContext.Current.Request.UrlReferrer;
            return Uri == null ? "" : Uri.Host.ToString();
        }
    }
    public static string GetUrlTokenDecode(string s)//获得UrlTokenDecode
    {
        try
        {
            return string.IsNullOrEmpty(s) ? "" : Encoding.Default.GetString(HttpServerUtility.UrlTokenDecode(s));
        }
        catch { log4net.Error("GetTokenDecode, s=" + s); return ""; }
    }
}

同求答案
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,