Aspnet Boilerplate / Aspnet Zero slow(IoC)

时间:2017-11-13 11:15:20

标签: asp.net-mvc dependency-injection castle-windsor aspnetboilerplate

我将aspnetboilerplate / aspnetzero模板用于我的Multi-Tenant SaaS应用程序和Multi-Database。 这使用CastleWindsor作为DI Framework。

我遇到非常糟糕的性能,我用dotTrace跟踪它 - 它说Castle.MicroKernel是最活跃的代码。

我的请求大约需要5-6秒,并且大部分时间都会超过控制器。 (调试时) 我认为解决所有服务/控制器的速度很慢。我将一些依赖项(App-Services)从Transient更改为PerWebRequestLifetime,但它不会影响性能。

有谁知道,我如何才能获得更好的表现?

在我的视图(_Layout文件)中,我调用几个不同的Childactions,它们在Layoutcontroller上,此Controller获取以下服务注入:

afterTextChanged()

行动

public class MainActivity extends AppCompatActivity {

    final static int RED_COLOR = Color.parseColor("#fb7373");
    final static int GREEN_COLOR = Color.parseColor("#40de83");

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        EditText editText = findViewById(R.id.editText);
        final TextView tvBeforeText = findViewById(R.id.tvBeforeText);
        final TextView tvBeforeNumbers = findViewById(R.id.tvBeforeNumbers);
        final TextView tvAfterText = findViewById(R.id.tvAfterText);
        final TextView tvAfterNumbers = findViewById(R.id.tvAfterNumbers);

        editText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                SpannableString spannableString = new SpannableString(s);
                BackgroundColorSpan backgroundSpan = new BackgroundColorSpan(RED_COLOR);
                spannableString.setSpan(backgroundSpan, start, start + count, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                tvBeforeText.setText(spannableString);
                tvBeforeNumbers.setText("start=" + start + "  count=" + count + " after=" + after);
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                SpannableString spannableString = new SpannableString(s);
                BackgroundColorSpan backgroundSpan = new BackgroundColorSpan(GREEN_COLOR);
                spannableString.setSpan(backgroundSpan, start, start + count, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                tvAfterText.setText(spannableString);
                tvAfterNumbers.setText("start=" + start + " before=" + before + " count=" + count);
            }

            @Override
            public void afterTextChanged(Editable s) {
                Log.i("TAG", "afterTextChanged: " + s);
            }
        });
    }
}

和类似的...但我用一个空的布局文件检查了性能,但我的请求仍然需要太长时间

2 个答案:

答案 0 :(得分:5)

ASP.NET Boilerplate性能基准测试结果

我们创建了两个相同的简单应用程序:一个使用ABP(https://github.com/aspnetboilerplate/aspnetboilerplate-samples/tree/master/TestProjects/AbpPerformanceTestApp

和其他没有ABP(https://github.com/aspnetboilerplate/aspnetboilerplate-samples/tree/master/TestProjects/StandartTestApp

的人

二手框架

  • ASP.NET Core 1.x
  • EF Core 1.x

测试工具

我们使用jMeter进行测试。

测试结果

没有ABP

Without ABP

使用ABP

With ABP

从统计数据中可以看出,ABP在默认的asp.net代码之上增加了平均5ms的开销。由于此开销是CPU使用率,因此吞吐量平均为5%不同。

我们禁用了ABP的日志记录和事务处理以便更好地进行比较(因为它使用I / O,所以记录特别是效果性能)。默认情况下启用其他方面,过滤器和功能。

答案 1 :(得分:5)

感谢史蒂文斯评论:

  

确保您的注射构造器快速。在对象图构建过程中,您可能正在进行某种I / O操作。

我实际上发现,这就是问题所在。我们的一个服务在构造函数中执行了I / O - 这非常慢并导致IoC-Container实例化它的性能不佳。