假设我有一个旨在实例化的类.我在类中有几个私有的"帮助器"方法,它们不需要访问任何类成员,并且只对它们的参数进行操作,返回结果.
public class Example {
private Something member;
public double compute() {
double total = 0;
total += computeOne(member);
total += computeMore(member);
return total;
}
private double computeOne(Something arg) { ... }
private double computeMore(Something arg) {... }
}
Run Code Online (Sandbox Code Playgroud)
有没有特别的理由指定computeOne和computeMore作为静态方法 - 或任何特殊原因不?
将它们保持为非静态是最容易的,即使它们肯定是静态的而不会引起任何问题.
假设我在C++中有一个数组:
double* velocity = new double[100];
Run Code Online (Sandbox Code Playgroud)
使用GDB命令行,我可以使用以下命令查看此数组:
> print *velocity @ 100
Run Code Online (Sandbox Code Playgroud)
它将打印一个格式良好的列表,列出数组中的所有double值.
但是,在使用Xcode调试器时,它所做的最多就是将其视为指向单个double值的指针,并在变量列表中显示velocity [0].
这使得它成为一个真正的PITA来调试包含大型动态分配数组的程序.必须有一些方法来告诉Xcode"这是一个指向长度为100的数组的指针",并让它显示这样的东西.有人知道这是什么吗?
不是一个编程问题,但与许多程序员有关......
假设我已经打开了另一台计算机的SSH会话.
remote:html avalys $ ls
welcome.msg index.html readme.txt
remote:html avalys $
是否有任何命令可以在我的远程shell中键入,它会立即将当前目录中的一个文件(例如welcome.msg)传输到我的本地计算机,即
remote:html avalys $ stransfer welcome.msg
获取/home/avalys/html/welcome.msg到welcome.msg
/home/avalys/html/welcome.msg 100%23KB 23.3KB/s 00:00
remote:html avalys $
我知道这样做的唯一方法是在SSH会话中打开并行SFTP会话和CD到我当前的目录,这是远程管理服务器时的真正PITA.
编辑:我知道使用反向sftp/scp连接的可能性,但这涉及更多的打字.如果我只能键入一些命令的名称(例如"stransfer"),以及我想要传输的文件,那就太棒了.
为什么用Java,我可以写
List<?> list = new LinkedList<Double>();
Run Code Online (Sandbox Code Playgroud)
但不是
List<Container<?>> list = new LinkedList<Container<Double>>();
Run Code Online (Sandbox Code Playgroud)
容器就是这样的东西
public class Container<T> { ... }
Run Code Online (Sandbox Code Playgroud)
这是因为我有一个接受a的方法,List<Container<?>>我想使用Arrays.asList将参数传递给它:
process(Arrays.asList(new Container<Double>(), new Container<Double>()));
Run Code Online (Sandbox Code Playgroud)
但是语言不允许这样做,因为它推断出的类型Arrays.asList是List<Container<Double>>,而且不能分配List<Container<?>>.
如果我将一个String参数化的容器添加到调用中,
process(Arrays.asList(new Container<Double>(), new Container<String>()));
Run Code Online (Sandbox Code Playgroud)
它仍然不起作用,因为它推断出List<Container<? extends Serializable & Comparable<?>>>Arrays.asList 的类型.只有当我传入既不可比较也不可序列化的东西时,它才能正常工作.
当然,我可以放一个演员并让编译器关闭,但我想知道我在这里做错了什么.
我们最近购买了一台双Intel X5650工作站,在Ubuntu 10.04下运行浮点密集型仿真.
每个X5650都有6个内核,因此共有12个内核.这些代码非常平行,所以我主要用12个线程运行它,并通过"top"观察大约"1200%"的处理器利用率.
在BIOS中启用了超线程,因此操作系统名义上可以看到24个可用核心.如果我将线程数增加到24,则top报告大约2000%的处理器利用率 - 但是,实际代码性能似乎没有增加20/12.
我的问题是 - HyperThreading如何在最新一代的Xeon上实际运行?浮点密集型代码是否会因为每个核心调度多个线程而受益?如果工作集大小与高速缓存大小相比,答案会更改,相比之下要大几倍,或者是否存在大量I/O操作(例如,将模拟输出写入磁盘)?
另外 - 当启用超线程时,我应该如何解释"顶部"的处理器利用率百分比?
floating-point optimization performance multithreading hyperthreading
我一直在使用Yourkit 8.0来分析在Mac OS X(10.5.7,Apple JDK 1.6.0_06-b06-57)下运行的数学密集型应用程序,并注意到CPU分析结果中有一些奇怪的行为.
例如 - 我使用抽样进行了分析运行,其中报告了应用程序的10分钟运行时的40%用于StrictMath.atan方法.我发现这令人费解,但我接受了它的话,花了一点时间用非常简单的多项式拟合替换atan.
当我再次运行应用程序时,它几乎与以前完全相同(10分钟) - 但我的atan替换在分析结果中无处可见.相反,其他主要热点的运行时百分比只是增加以弥补它.
总结一下:
结果使用StrictMath.atan(本机方法)
总运行时间:10分钟
方法1:20%
方法2:20%
方法3:20%
StrictMath.atan:40%
结果简化,纯Java atan
总运行时间:10分钟
方法1:33%
方法2:33%
方法3:33%
(方法1,2,3不执行任何atan调用)
知道这种行为是什么吗?我使用EJ-Technologies的JProfiler获得了相同的结果.似乎JDK概要分析API报告了本机方法的不准确结果,至少在OS X下是这样.
在Linux下,如何判断具体进程拥有/正在使用物理内存中的给定地址?
我知道这可能需要编写一个内核模块来访问一些内核数据结构并将结果返回给用户 - 我需要知道它是如何完成的,无论它有多复杂.