在回答了关于如何用Java强制释放对象的问题(这个人正在清除一个1.5GB的HashMap)后System.gc()
,我被告知System.gc()
手动调用是不好的做法,但这些评论并不完全令人信服.此外,似乎没有人敢投票,也没有人回答我的回答.
我被告知这是不好的做法,但后来我也被告知垃圾收集器运行不再系统地停止世界,并且它也可以有效地被JVM用作提示,所以我有点像茫然
我知道JVM在需要回收内存时通常比你知道的要好.我也明白,担心几千字节的数据是愚蠢的.我也明白,甚至数兆字节的数据也不是几年前的数据.但仍然,1.5千兆字节?而且你知道内存中有1.5 GB的数据; 它不像是在黑暗中拍摄.是System.gc()
系统性的坏,还是有一点它变得好吗?
所以问题实际上是双重的:
System.gc()
?它是否仅仅是某些实现中JVM的提示,还是一个完整的收集周期?真的有垃圾收集器实现可以在不停止世界的情况下完成工作吗?请详细说明人们在评论中对我的回答所做的各种断言.System.gc()
,或者有时候可以接受?如果是这样,那些时候是什么时候?Swift有一个非常类似于C#的属性声明语法:
var foo: Int {
get { return getFoo() }
set { setFoo(newValue) }
}
Run Code Online (Sandbox Code Playgroud)
但是,它也有willSet
和didSet
行动.这些在分别调用setter之前和之后调用.考虑到你可以在setter中使用相同的代码,它们的目的是什么?
我经常发现这三种变体:
SELECT COUNT(*) FROM Foo;
SELECT COUNT(1) FROM Foo;
SELECT COUNT(PrimaryKey) FROM Foo;
Run Code Online (Sandbox Code Playgroud)
据我所知,他们都做同样的事情,我发现自己在我的代码库中使用了三个.但是,我不喜欢以不同的方式做同样的事情.我应该坚持哪一个?他们中的任何一个比其他两个更好吗?
我有一个值为的NSString
http://digg.com/news/business/24hr
Run Code Online (Sandbox Code Playgroud)
如何在第3级之前获得所有内容?
http://digg.com/news/
Run Code Online (Sandbox Code Playgroud) C++很酷的一点是,它允许您创建指向成员类型的变量.最常见的用例似乎是获取指向方法的指针:
struct foo
{
int x() { return 5; }
};
int (foo::*ptr)() = &foo::x;
foo myFoo;
cout << (myFoo.*ptr)() << '\n'; // prints "5"
Run Code Online (Sandbox Code Playgroud)
然而,乱搞,我意识到他们也可以指向成员变量:
struct foo
{
int y;
};
int foo::*ptr = &foo::y;
foo myFoo;
myFoo.*ptr = 5;
cout << myFoo.y << '\n'; // prints "5"
Run Code Online (Sandbox Code Playgroud)
这很漂亮.它引导我进一步实验:如果你能得到指向结构子成员的指针怎么办?
struct foo
{
int y;
};
struct bar
{
foo aFoo;
};
int bar::*foo::*ptr;
Run Code Online (Sandbox Code Playgroud)
这实际上编译.
但是,我不知道如何分配任何有用的东西.以下都不起作用:
int bar::*foo::*ptr = &bar::foo::y; // no member named "foo" in "bar"
int …
Run Code Online (Sandbox Code Playgroud) 我最近一直在考虑这个问题,在我看来,JIT编译的大多数优点应该或多或少地归结为中间格式,并且jints本身并不是生成代码的好方法.
所以这些是我经常听到的主要的JIT编译参数:
它不像提前编译也没有优势.即时编译有时间限制:在程序启动时,您不能让最终用户永远等待,因此需要权衡某些事情.大多数时候他们只是减少优化.我的一个朋友有分析证据表明内联函数和"手动"展开循环(在过程中混淆源代码)对他的C#号码运算程序的性能产生了积极影响; 在我这方面做同样的事情,我的C程序填写相同的任务,没有产生任何积极的结果,我相信这是由于我的编译器允许进行广泛的转换.
然而,我们被jitted程序包围.C#和Java无处不在,Python脚本可以编译成某种字节码,我确信其他一些编程语言也是如此.我必须有一个很好的理由让我失踪.那么什么使即时编译如此优于提前编译?
编辑为了清除一些混淆,也许重要的是要声明我全都是可执行文件的中间表示.这有很多优点(实际上,实时编译的大多数参数实际上是中间表示的参数).我的问题是如何将它们编译为本机代码.
大多数运行时(或编译器)都倾向于及时或提前编译它们.由于编译器有更多的时间来执行优化,因此提前编译看起来像是一个更好的替代方案,我想知道为什么微软,Sun和所有其他人都在反过来.我对与分析相关的优化有点怀疑,因为我对即时编译程序的经验表现出很差的基本优化.
我用了一个例子与C语言代码,只是因为我需要的例子名列前茅的时间编制与刚刚在时间编译.C代码没有发送到中间表示的事实与情况无关,因为我只需要表明提前编译可以产生更好的即时结果.
纵观LLVM文件,他们提到,他们使用"RTTI的自定义窗体",这是他们的原因isa<>
,cast<>
和dyn_cast<>
模板功能.
通常,阅读一个库重新实现一种语言的一些基本功能是一种可怕的代码味道,只是邀请运行.但是,这是我们所说的LLVM:这些人正在研究C++编译器和 C++运行时.如果他们不知道他们在做什么,我会非常沮丧,因为我更喜欢Mac OS附带clang
的gcc
版本.
尽管如此,由于缺乏经验,我还是想知道正常RTTI的缺陷是什么.我知道它只适用于有v-table的类型,但只提出两个问题:
virtual
?虚拟析构函数似乎很擅长这一点.在C#中,foreach是否会在任何实现IDisposable的对象上自动调用Dispose?
http://msdn.microsoft.com/en-us/library/aa664754(v=vs.71).aspx似乎表明它确实:
*否则,集合表达式是一个实现System.IEnumerable的类型,而foreach语句的扩展是:复制
IEnumerator enumerator =
((System.Collections.IEnumerable)(collection)).GetEnumerator();
try {
while (enumerator.MoveNext()) {
ElementType element = (ElementType)enumerator.Current;
statement;
}
}
finally {
IDisposable disposable = enumerator as System.IDisposable;
if (disposable != null) disposable.Dispose();
}
Run Code Online (Sandbox Code Playgroud) 我个人喜欢这个<fieldset>
标签,因为它如何绘制一个盒子并将<legend>
它放在边框上方.像这样.
但是,该fieldset
元素用于组织表单,并且将其用于一般设计并不比使用表格进行一般设计更好.所以,我的问题是...... 如何使用另一个标签获得相同的结果?边框必须在<legend>
(或任何其他标签将被使用)下删除,并且因为可能存在"复杂的"身体背景图像,所以我不能仅设置background-color
图例以匹配元素之一下.
我希望它能在没有JavaScript的情况下工作,但CSS3和基于XML的格式(如SVG或XHTML)都可以.