【问题标题】:Is it faster to read raw json files or jsonified C# classes?读取原始 json 文件或 jsonified C# 类是否更快?
【发布时间】:2013-09-20 03:11:11
【问题描述】:

在实例化类的 N 个对象的 .cshtml 文件中创建站点使用的数据对我来说更容易(与创建 .json 文件相反)。在之前创建原始 json 文件之后,我最近才更改为这种方法。

读取数据的代码,无论是.json还是.cshtml,都是一样的:

$.getJSON('Content/noba.json', function (data) {
            $.each(data, function (i, dataPoint) {
    . . .

$.getJSON('getHugos.cshtml', function (data) {
            $.each(data, function (i, dataPoint) {
    . . .

大概是读取原始json,像这样:

. . .
{
    "category":"Outdoor Literature",
    "title":"Almost Somewhere: Twenty-Eight Days on the John Muir Trail",
    "author":"Suzanne Roberts",
    "kindle":"B008SAOT4C",
    "hardbound":"--",
    "paperback":"0803240120",
    "imghref":"http://www.amazon.com/exec/obidos/ASIN/B008SAOT4C/garrphotgall-20\" target=\"_blank\" ><img height=\"180\" width=\"120\" src=\"http://images.amazon.com/images/P/B008SAOT4C.01.MZZZZZZZ.jpg\" alt=\"Suzanne Roberts Book Cover\" /></a>"
  },
. . .

...会比这种东西更高效:

@{
    var books = new List<BookClass>
    {
        new BookClass{Year=2013, YearDisplay="blankYearDisplay", Category="2013", Title="blankTitle", Author="blankAuthor", KindleASIN="blankKindleASIN", HardboundASIN="blankHardboundASIN", PaperbackASIN="blankPaperbackASIN", ImgSrc="blankImgSrc"},
. . .
        new BookClass{Year=2001, YearDisplay="2001", Category="Best Novella", Title="The Ultimate Earth", Author="Jack Williamson", KindleASIN="B00DV8TSHO", HardboundASIN="--", PaperbackASIN="1612421547", ImgSrc="http://images.amazon.com/images/P/B00DV8TSHO.01.MZZZZZZZ"}
    };
    Response.ContentType = "application/json";
    Json.Write(books, Response.Output);
}

...必须通过 ASP.NET 进行额外的步骤才能转换为:

[...,{"Year":2013,"YearDisplay":"2013","Category":"Best Novel","Title":"Redshirts","Author":"John Scalzi","KindleASIN":"B0079XPUOW","HardboundASIN":"0765316994","PaperbackASIN":"0765334798","ImgSrc":"http://images.amazon.com/images/P/B0079XPUOW.01.MZZZZZZZ"},...]

...但众所周知,假设事情有时会给我们带来麻烦。

我知道你在想什么——只要测试一下就知道了;但是我还没有创建足够多的 cshtml 记录来比较这两种方法,但是想知道是否有人知道加载原始 json 文件的速度是否比将 C# 类转换为 json 数据要快得多?如果是这样,我可能不得不恢复我以前的方法......

更新

您可以自己检查 (www.awardwinnersonly.com),但根据我的观察,两个大小大致相同的列表(书籍 > 国家户外图书奖和书籍 > Hugos(科幻小说),第一个访问原始json 文件和另一个转换为 json 的 C#/Razor 类,以相同的速度加载(我没有使用秒表之类的,但我正在寻找更多只是为了更快的一般感觉)。我的下一个类别(激励奖),我将加载一个 htm 文件,而不是做任何后端流水线的东西,然后看看。

如果有的话,cshtml文件比NOBA json文件快;它甚至比 Music > CMA json 文件还要快,后者的项目要少得多。我不知道为什么会这样,除非 Razor 引擎针对此类操作进行了超优化。

更新 2

直到现在我才想到它,但这是使用 jsonified 的 C# 类而不是直接访问 json 文件的优势 - 我可以(大概我还没有尝试过)在其中设置一个断点当它被 $.getJSON('getHugos.cshtml') 调用时,C# 代码会逐步执行它

【问题讨论】:

  • 只要你有一个继续,复制/粘贴或循环数据以使其足够大以给你一个有效的测试应该不难。这样做并告诉我们什么是最快的!
  • 我会等到第一个 cshtml 文件完成后,看看它是否比其他文件更快捷或更流畅。我应该在一周左右的时间内完成;我只是想知道那里是否有人已经确定了。

标签: asp.net json performance razor getjson


【解决方案1】:

拥有一个原始 JSON 文件可以工作并节省从 C# 序列化为 JSON 所需的一些计算。此外,让 IIS 不运行 .NET 管道而是更高效的“读取文件并写入响应流”本机代码节省了额外的开销,因为它不是动态的。但问题是您现在无法手动或通过作业创建原始 JSON 文件。如果您打算手动维护它,请确保它是可行的并且不会经常更改。

如果是这样,并且您想保留这种在客户端上存储所需数据的性能更高的方法,您将不得不维护一段单独的代码,该代码将使用适当的值刷新该文件,这样您就不会无论如何都要在最后节省 C# 的行数(尽管编写周期性任务并不困难并且性能更高)。

【讨论】:

  • 所有这些文件(现有的 12 个 .json 文件,以及最终的 11 个 .cshtml 文件)都需要每年更新一次 - 在颁发新奖项时。所以大约一个月一次,我将添加到一个 json 文件,一个月一次,我将添加到一个 cshtml 文件。我已经编写了实用程序来执行此操作,因此基本上是数据输入,然后复制和粘贴的问题。
  • 要记住的一点是,尽管这两种方法在浏览器中的加载速度似乎相同,但我很确定 C#->JSON 方法在每次加载页面时会占用更多 CPU比直接从文件读取的 JSON。现在对您的网站来说可能无关紧要,但提高效率始终是一件值得努力的事情。
  • 是的,你是对的。对于我在 (Spur) 的下一个奖项,我将直接使用 html - 我不会在收集数据时动态生成 json 文件或类实例化代码,而是动态生成所需的 html,并将其存储在 .html 中我将使用 jQuery 调用的文件,如下所示: $('#BooksContent').Load('Spurs.html');
猜你喜欢
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 2019-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多