据国外媒体报道,网页浏览器内存占用情况可能不会影响到内存容量高达数十亿字节的现代计算机。但随着上网本及其他低端电脑市场的兴起,网页浏览器内存占用情况又重新引起我们的注意。Dot Net Pearls网站近日对四款浏览器内存占用进行了测试。对于低端电脑用户而言,这个测试结果可能有一点的借鉴意义。
Dot Net Pearls测试的浏览器包括谷歌Chrome、Firefox、Opera 10及Safari。测试中,这些浏览器通过C#命令代码打开了30个标签页,其中一段代码被用来在后台记录内存占用。
|
|
最大值( MB )
|
平均值( MB )
|
最终值( MB )
|
|
Chrome
|
1216.16 (最大)
|
543.83 (最大)
|
109.49
|
|
Firefox
|
327.65 (最小)
|
166.82 (最小)
|
106.66 (最小)
|
|
Opera
|
554.11
|
347.45
|
441.49 (最大)
|
|
Safari
|
517.00
|
319.44
|
349.62
|
Dot Net Pearls把测试分成三类进行对比,包括最大值,平均值和最终值(所有标签页都被关闭)。从上面的结果中可以看出,Firefox浏览器的内存占用最低,谷歌Chrome的最大值和平均值最高。
不过,Dot Net Pearls的测试存在一定的缺陷。事实上,为了对比所有进程的内存占用情况,该项测试重复计算了每个进程的共用内存。Chromium博客就指出:
“如果要测算谷歌Chrome这类多进程浏览器的内存,测试者应该考虑到共用内存。如同通过Windows XP任务管理器计算内存占用,每个进程的共用内存都会被重复计算。在有较多进程的情况下,这样要多计算30-40%的内存。
为了说明多进程浏览器的内存占用,谷歌Chrome通过“关于:内存”(about:memory)页面详细地说明了Chrome内存占用情况,同时也与其他浏览器进行了最基本的对比。”
即使这样,谷歌Chrome的内存占用仍然比Firefox高,但这是多进程浏览器的共病。如果对微软最新版浏览器IE 8进行测试,其结果也是一样的。因此,我们不能简单地归咎于技术问题。
另一个需要提出的是Opera的测试结果。Opera浏览器有一个称为自动设置缓存大小(Automatic RAM Cache)默认功能,它可以默认分担10%的电脑内存,Dot Net Pearls的测试应该没有统计这个数据。尽管如此,Opera可能还是要输给Firefox,但两者间的差距应该会缩小。
测试代码如下:
~~~ Console program that uses Process.Start (C#) ~~~
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading;
class Program
{
/// <summary>
/// Number of points to close stuff.
/// </summary>
const int _interrupt = 30;
/// <summary>
/// Browsers urls are sent to.
/// </summary>
static string[] _browsers =
{
@"C:\Program Files\Mozilla Firefox 3.5 Beta 4\firefox.exe",
@"C:\Program Files\Safari\Safari.exe",
//@"C:\Program Files\Internet Explorer\iexplore.exe",
@"C:\Program Files\Opera 10 Preview\opera.exe",
@"C:\Users\Sam\AppData\Local\Google\Chrome\Application\chrome.exe"
};
static void Main()
{
var r = new Random();
var ct = 1;
foreach (var url in GetUrls())
{
if ((ct % 30) == 0) // Notify
{
Console.BackgroundColor = ConsoleColor.DarkRed;
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine("Close all tabs but one in all browsers then press enter.");
Console.ResetColor();
Console.ReadLine();
}
foreach (var b in _browsers) // Loop through browsers
{
try
{
var info = new ProcessStartInfo(b, url);
Process.Start(info); // Start url in this browser
Thread.Sleep(r.Next(100, 1000)); // Sleep 100 ms - 1 s
}
cat9 7 3
ch
{
}
}
Thread.Sleep(r.Next(2000, 5000)); // Sleep 2 - 5 seconds.
ct++;
}
}
/// <summary>
/// Get list of top 2000 urls.
/// </summary>
static IEnumerable<string> GetUrls()
{
return File.ReadAllLines("top.txt").Where(item => item != null &&
item.Length > 1 &&
item[0] != '#').Select(item => "http://" + item);
}
}

