我正在编写一个允许用户对程序进行基准测试的小应用程序。目前我正在分析一些测试程序的结果,我对我所看到的内容感到非常惊讶。我用于测量的PC有16GB RAM。以下是蒙特卡罗积分算法的源代码和结果。
这是C#源代码:
private const long Iterations = 100000000;
static void Main(string[] args)
{
Random rand = new Random();
int underCurve = 0;
for (int i = 0; i < Iterations; i++)
{
double x = rand.NextDouble();
double y = rand.NextDouble();
if (x * x + y * y <= 1.0)
{
underCurve++;
}
}
Console.WriteLine(((double)underCurve / Iterations) * 4.0);
}
以下是C#结果:
9785344
9711616
9633792
9691136
9740288
9691136
9768960
9662464
9695232
9662464
Minimum memory consumed = 9633792
Maximum memory consumed = 9785344
Maximum memory consumed = 9704243
这是Java源代码:
private static long Iterations = 100000000;
public static void main(String[] args) {
Random rand = new Random();
int underCurve = 0;
for (int i = 0; i < Iterations; i++){
double x = rand.nextDouble();
double y = rand.nextDouble();
if (x * x + y * y <= 1.0){
underCurve++;
}
}
System.out.println(((double)underCurve/Iterations)* 4.0);
}
以下是Java结果:
454193152
454152192
454201344
454238208
454098944
454258688
454144000
454135808
454189056
454115328
Minimum memory consumed = 454098944
Maximum memory consumed = 454258688
Average memory consumed = 454172672
这是我用来衡量进程内存消耗的代码:
private static long MeasureMemoryConsumption(String name, string workingDirectory, String arguments)
{
Process process = new Process();
process.StartInfo.WorkingDirectory = workingDirectory;
process.StartInfo.FileName = name;
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.Arguments = arguments;
long peakMem = 0;
Thread memMeasuringThread = new Thread(() =>
{
while (true)
{
try
{
process.Refresh();
peakMem = peakMem < process.PrivateMemorySize64 ? process.PrivateMemorySize64 : peakMem;
}
catch (InvalidOperationException)
{
//ignore, process didn't start yet
}
}
});
memMeasuringThread.Start();
process.Start();
process.WaitForExit();
memMeasuringThread.Abort();
return peakMem;
}
在执行期间查看资源监视器时,我可以看到&#34; Private&#34;资源监视器中的值始终保持很小(大约10 MB),&#34;提交&#34; Java程序的值很大(~400 MB)。对于C#版本,情况并非如此。我想这与问题有关,但是,在我的测量代码中,我使用的是PrivateMemorySize64属性。
我的问题是,Java版本如何消耗比C#版本更多的内存,如果是由于我的错误,我怎样才能获得更准确的测量?
答案 0 :(得分:0)
小程序的内存占用始终是java应用程序的一个问题。如果你尝试了一些像leetcode这样的OJ服务,你会发现与C / C ++ / Python / JS / C#相比,Java实现总是具有更大的内存占用和更长的启动时间:
不同的JVM有不同的启动参数(例如JRockit: Tuning For a Small Memory Footprint),也许你可以尝试一下。
此外,我认为这个答案是might explain something。