asp.net核心中的Razor非常慢

时间:2016-06-09 11:53:46

标签: asp.net-mvc razor

我创建了一个小的asp.net核心mvc项目来测试Linux上的asp.net应用程序的速度(Ubuntu 16.04)。

我创建了与AspUser类(存储在PostgreSQL数据库中)一起使用的CRUD控制器。当我调用显示存储用户列表的索引方法时,剃刀渲染速度非常慢。渲染内容需要2秒钟(这不是第一次调用 - 第一次调用需要8秒)。数据库中有1000个用户。

wrk实用程序wrk -c 256 -t 32 -d 10 http://localhost:5000/aspusers每秒显示2,6个请求。 我在nodejs中做了相同的例子,wrk实用程序每秒显示20个请求。

HW:Amd FX 8150 8 Core,3.6 GHz,8 GB RAM

有人知道为什么视图渲染速度如此之慢?

型号:

[Table("asp_users")]
public class AspUser
{
    [Column("id")]
    public long Id { get; set; }

    [Column("first_name")]
    [Required]
    public string FirstName { get; set; }

    [Column("last_name")]
    public string LastName { get; set; }

    [Column("age")]
    public int Age { get; set; }

    [Column("created_at")]
    public DateTime CreatedAt { get; set; }

    [Column("updated_at")]
    public DateTime UpdatedAt { get; set; }
}

控制器:

public class AspUsersController : Controller
{
    public async Task<IActionResult> Index()
    {
        var users = await _context.AspUsers.OrderBy(a => a.Age).ToListAsync();
        return View(users);
    }
}

查看:

@model IEnumerable<PostgresTest.Models.AspUser>
@{
    ViewData["Title"] = "Index";
}

<h2>Index</h2>
<p>
    <a asp-action="Create">Create New</a>
</p>
<table class="table">
    <thead>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Age)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.FirstName)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.LastName)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.CreatedAt)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.UpdatedAt)
        </th>
        <th></th>
    </tr>
    </thead>
    <tbody>
        @foreach (var item in Model)
        {
            <tr>
                <td>
                    @item.Age
                </td>
                <td>
                    @item.FirstName
                </td>
                <td>
                    @item.LastName
                </td>
                <td>
                    @item.CreatedAt
                </td>
                <td>
                    @item.UpdatedAt
                </td>
                <td>
                    <a asp-action="Edit" asp-route-id="@item.Id">Edit</a> |
                    <a asp-action="Details" asp-route-id="@item.Id">Details</a> |
                    <a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
                </td>
            </tr>
        }
    </tbody>
</table>

1 个答案:

答案 0 :(得分:1)

您可以为来自数据库和ViewModel的数据创建一个单独的模型

例如:

视图模型

public class ViewAspUser
{

    public long Id { get; set; }

    [Required]
    public string FirstName { get; set; }

    [Required]
    public string LastName { get; set; }

    [Required]
    public int Age { get; set; }

    [Required]
    public DateTime CreatedAt { get; set; }

    [Required]
    public DateTime UpdatedAt { get; set; }
}

数据类

public class DataAspUser
{
    [Column("id")]
    public long Id { get; set; }

    [Column("first_name")]
    public string FirstName { get; set; }

    [Column("last_name")]
    public string LastName { get; set; }

    [Column("age")]
    public int Age { get; set; }

    [Column("created_at")]
    public DateTime CreatedAt { get; set; }

    [Column("updated_at")]
    public DateTime UpdatedAt { get; set; }
}

这样可行,因为我遇到了同样的问题。最后我将这个类分开了。这是因为如果你使用带有dataannotation的模型,那么当你在View中访问你的剃须刀时,它会连接到数据库。