私有静态方法private static method-值得用吗?

Resharper的同学都知道,如果你写了一个私有函数,这个函数没有访问类里面的其他参数和方法,那么它建议你标记这个方法为私有静态方法,提示是这样的:

值得这样做吗?看看微软的建议

After you mark the methods as static, the compiler will emit non-virtual call sites to these members. Emitting non-virtual call sites will prevent a check at runtime for each call that ensures that the current object pointer is non-null. This can result in a measurable performance gain for performance-sensitive code. In some cases, the failure to access the current object instance represents a correctness issue.

意思就是说,编译器对标记为静态的函数无需检测this指针是否为空,有时候这样的检测会对性能敏感的应用产生影响。说的比较笼统,其实原因是对非静态函数来说,都会默认传递第一个this参数,就是this地址,调用的时候会首先压入栈;如果是静态函数,this指针的入栈这一步就免了,IL就免了ldrag.0这一步:

CPU方面

而大家知道,传递一个额外的参数给函数需要一些开销,CPU要把它放到寄存器,然后把它压入线程栈(Thread Stack)等等。省了这一步自然性能有所提升。但其实和装箱拆箱、算法、IO访问、数据库和网络访问等比起来简直就是微乎其微,后几项对性能的影响可能是十倍甚至百倍的。

内存方面

内存方面,大家知道函数和变量不同,变量的话私有的在线程栈(Thread Stack)中(调用函数前分配该内存),静态的在全局堆(Heap)里面(在加载AppDomain的时候就分配)。函数在内存中通常是存放在代码段(Code Segment),但在.NET中是在堆(Heap)里面,函数刚开始存在assembly中然后被映射到进程内存中,JIT编译器把他们复制为native code并被执行,所以基本上函数在内存中是存在堆(Heap)里面。不是每个实例(instance)一份,只有一份。

该不该用?

如果你的私有函数没有访问类里面的其他参数和方法,又被频繁调用,那就把他设为private static吧,没有什么坏处哦。看看微软的源码里面,也是大量使用私有静态方法:

最后提醒一句,public static的变量/方法/事件慎用,很容易引起内存泄露的问题。

私有静态方法private static method-值得用吗?

时间: 2024-07-31 04:44:05

私有静态方法private static method-值得用吗?的相关文章

对私有静态方法进行单测

对私有静态方法进行单测 1.被单测的类: /** * Created by 58 on 2016-8-21. */ public class Student { private static String reading(String bookName) { return "student read " + bookName; } } 2.使用junit方式 @Test public void readingTest() { String expected = "studen

018: class, objects and instance: static method

静态方法 使用@staticmethod来标记,该方法与某一个class或者某一个实例无关系,但可以用类名或者实例来调用,实际上这种写法应该一般只是为了组织代码. 实例方法的调用需要一个实例,声明时需要用self参数,调用时隐式传入该实例 类的方法调用需要一个类,其实该类本质上也是一个对象,声明时需要class参数,调用时隐式传入该类 静态方法调用不需要实实例也不需要类,其实该方法本质上与该类毫无关系,唯一的关系就是名字会该类有些关系, 用途应该只是为了组织一些代码,本质上和面向对象无关 cla

静态方法块 static 的用法

使用静态块的好处:只要在类被加载时,static块就会被调用,整个过程就调用这么一次,不会在后面的对象处又不断的调用.如果不使用它就会出现,new一个对象,我就要调用一次这些内容,重复被调用,从而增加开销. 这个程序就是用静态方法块,测试输入一个人的出生日期,判断是否在给定出生日期范围内出生,如果是就返回true,否则返回false. package com.liaojianya.chapter5; import java.sql.Date; /** * This program will de

浅析java修饰符之public default protected private static final abstract

浅析java修饰符之public default protected private static final abstract 一   修饰符的作用:用来定义类.方法或者变量,通常放在语句的最前端 二   分类(大致分两类) 1.访问修饰符,包括:public default protected private 2.非访问修饰符,包括:static final abstract 三 访问修饰符--Java中,可以使用访问控制符来保护对类.变量.方法和构造方法的访问.Java支持4种不同的访问权

Python OOP(2)-static method,class method and instance method

静态方法(Static Method): 一种简单函数,符合以下要求: 1.嵌套在类中. 2.没有self参数. 特点: 1.类调用.实例调用,静态方法都不会接受自动的self参数. 2.会记录所有实例的信息,而不是为实例提供行为. 简单说staticmethod 无法访问类属性.实例属性,相当于一个相对独立的方法,跟类其实没什么关系,换个角度来讲,其实就是放在一个类的作用域里的函数而已. #!python2 #-*- coding:utf-8 -*- class A: v1="class ar

Why it is good practice to declare loggers private, static, and final?

// Jakarta Commons Loggingprivate static final Log log = LogFactory.getLog(MyClass.class);The above code also shows another good practice, which is to pass the Class object to the getLog() method, instead of a string. Why the java.util.logging.Logger

JavaSE8基础 类中的public成员方法 可以返回 private static类型的成员变量

礼悟:    好好学习多思考,尊师重道存感恩.叶见寻根三二一,江河湖海同一体.          虚怀若谷良心主,愿行无悔给最苦.读书锻炼强身心,诚劝且行且珍惜. javaSE:8                                    os:windows7 x64                                   ide:MyEclipse 2017 代码 package com.jizuiku; /** * 提供成员变量 与 成员方法 * * @author

C++程序链接失败,无法解析的外部命令,无法解析的外部符号 "private: static class * Object::current"

C++程序编译结束后,出现链接失败提示: 严重性    代码    说明    项目    文件    行    类别    禁止显示状态错误    LNK2001    无法解析的外部符号 "private: static class Object* Object::current" ([email protected]@@[email protected])    Object    F:\C++\Object.obj    1 严重性    代码    说明    项目    文

private static的意义

private static instance:SoundManager; 此处使用private是为了避免外部调用类名.instance 来进行操作. 被private static修饰的属性仅仅可以被静态方法调用, 但是只能被本类中的方法(可以是非静态的)调用, 在外部创建这个类的对象或者直接使用这个类访问都是非法的. 被public static修饰的属性除了可以被静态方法和非静态调用之外, 还可以直接被类名和外部创建的对象调用. 原文地址:https://www.cnblogs.com/