我的问题很简单:
问: Java中的编译器会将getter/setter方法内联的几率是多少?
(显然没有明确的答案,但其他信息将不胜感激)
额外:我知道编译器(标准和JIT)总是有可能决定内联方法,当涉及到getter和setter这通常是程序员想要的.
提前致谢.
我会尽量保持这个简单.
在Windows窗体应用程序中创建的按钮如下所示:

如果我手动创建表单,我创建的按钮将如下所示:

我仔细查看了Windows窗体应用程序,发现没有任何代码可以改变按钮的视觉风格.
为什么会发生这种情况有什么简单的解释吗?
提前致谢.
Object Typecasting在性能方面有多昂贵?
我应该尽可能避免使用Typecasting吗?
我正在阅读Oreilly的Learning XNA 4.0,我注意到作者很容易创建一个结构值,例如Vector2或Rectangle多次,而不考虑性能.
例如,SquareCollision()检查两个游戏实体之间的碰撞的方法在Rectangle每次调用时都会创建两个s,而不是简单地让每个游戏实体保持其自己的Rectangle字段并比较这些字段而不创建任何更多的结构值.
我在很多地方已经多次看到这种模式,这让我很奇怪:
在C#中,结构值的创建是否可以忽略不计?
这真的属于微优化部分吗?
也许是因为我的经验主要是Java,ValueTypes 的概念对我来说很奇怪,但似乎从结构中重新创建一个值(并且多次调用它的构造函数)似乎是对资源的巨大浪费.
看到每次作为参数传递时都会创建值类型的新实例,我开始考虑使用ref或out关键字可以显示实质性性能改进的情况.
经过一段时间它打击了我,虽然我看到使用价值类型的不足,我不知道有什么好处.
所以我的问题很简单 - 拥有价值类型的目的是什么?我们通过复制结构而不是仅仅创建一个新的引用来获得什么?
在我看来,只有像Java一样的引用类型会容易得多.
编辑:只是为了清除它,我不是指小于8字节(参考的最大大小)的值类型,而是指8字节或更多的值类型.
例如 - Rectangle包含四个int值的结构.
c# value-type reference-type pass-by-reference pass-by-value
我主要使用C#开发,但我认为这个问题也适用于其他语言.
此外,似乎这里有很多代码,但问题很简单.
根据我的理解,内联是编译器(在C#是虚拟机的情况下)通过在调用方法的每个位置插入方法体来替换方法调用.
假设我有以下程序:
static Main()
{
int number = 7;
bool a;
a = IsEven(number);
Console.WriteLine(a);
}
Run Code Online (Sandbox Code Playgroud)
......方法的主体IsEven:
bool IsEven(int n)
{
if (n % 2 == 0) // Two conditional return paths
return true;
else
return false;
}
Run Code Online (Sandbox Code Playgroud)
我可以理解在内联方法后代码的样子:
static Main()
{
int number = 7;
bool a;
if (number % 2 == 0)
a = true;
else
a = false;
Console.WriteLine(a); // Will print true if 'number' is even, otherwise false
}
Run Code Online (Sandbox Code Playgroud)
一个明显简单而正确的程序.
但是,如果我调整IsEven …
有没有办法在TypeScript中定义属性module?
这些都没有编译:
module My {
// doesnt work
get Value(): number { return 42; }
// doesn't work either
get function Value(): number { return 42; }
// nope
function get Value(): number { return 42; }
}
Run Code Online (Sandbox Code Playgroud)
现在我被迫使用这个:
module My {
declare var Value: number;
Object.defineProperty(My, "Value", {
get: () => 42
});
}
Run Code Online (Sandbox Code Playgroud)
第二种形式对我来说似乎很混乱,代码提示并没有真正将它视为只读属性而是作为普通变量.
有没有直接在模块内定义属性的标准方法?
我当前使用此方法(C#)来获取以毫秒为单位的 Unix 时间:
long UnixTime()
{
return (long) (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0)).TotalMilliseconds;
}
Run Code Online (Sandbox Code Playgroud)
问题- 有没有办法获得以纳秒为单位的unix时间?
提前致谢。
当我在绘图时Canvas,我使用该createBufferStrategy(2)方法创建两个缓冲区.然而,我已经多次看到其他人创建三个缓冲区,并了解可以使用更多缓冲区.
我可以理解需要两个缓冲区,但我无法理解使用更多缓冲区的逻辑.
我的问题是 - 使用多个缓冲区的好处是什么?与两个缓冲区相比,它会如何影响性能?
提前致谢.
由于这些属性只是方法之下,可以理解的是,它们可能执行的任何逻辑的性能可能会或可能不会提高性能 - 因此JIT需要检查方法是否值得内联是可以理解的.
然而,自动属性(据我所知)不能有任何逻辑,只需返回或设置基础字段的值.据我所知,自动属性由编译器和JIT处理,就像任何其他方法一样.
(以下所有内容都依赖于上述段落正确的假设.)
值类型属性显示与变量本身不同的行为,但是参考类型属性应该具有与直接访问基础变量完全相同的行为.
// Automatic Properties Example
public Object MyObj { get; private set; }
Run Code Online (Sandbox Code Playgroud)
是否存在自动属性Reference Types可以通过内联显示性能受损的情况?
如果没有,是什么阻止编译器或JIT自动内联它们?
注意:我理解性能增益可能是微不足道的,特别是当JIT可能无论如何使用它时都可能内联它们 - 但是增益可能很小,似乎合乎逻辑的是,无论如何都会引入这种看似简单的优化.
c# ×6
java ×3
inline ×2
jit ×2
performance ×2
accessor ×1
casting ×1
eclipse ×1
properties ×1
struct ×1
typescript ×1
value-type ×1
xna ×1