【问题标题】:VS 2015 Transaction Response Times much higher than SilkPerformerVS 2015 交易响应时间远高于 SilkPerformer
【发布时间】:2016-09-09 22:56:15
【问题描述】:

我有一些针对我的应用程序运行的相对简单的事务,例如“启动用户会话”,通过 SilkPerformer 运行 VS 项目时通常需要几秒钟。当我尝试使用 VS 2015 性能测试工具(在控制器本地)执行相同的事务时,响应时间大约增加了 12 秒,重复。

我有一个事务记录器,它可以捕获每个事务的响应时间,因此我可以在 VS 中执行期间单独查看它们,我想知道我是否在某处遗漏了某个设置,或者我可以对配置进行更改项目,因为它看起来好像项目正在安排交易的执行。无论是直接在代理上还是在控制器上运行,我都会得到相同的行为,因此它似乎与网络无关。

这是正在执行的代码示例:

    public interface ITestTransactionTimer : IDisposable { }

    public class TestTransactionTimer : ITestTransactionTimer
    {
        public TestContext TestContext { get; private set; }
        public string TransactionName { get; private set; }

        public TestTransactionTimer(TestContext testContext, string transactionName)
        {
            this.TestContext = testContext;
            this.TransactionName = transactionName;

            this.TestContext.BeginTimer(this.TransactionName);
        }

        public void Dispose()
        {
            this.TestContext.EndTimer(this.TransactionName);
        }
    }

    public class NoOpTestTransactionTimer : ITestTransactionTimer
    {
        public void Dispose() { }
    }
    protected ITestTransactionTimer LogTransaction(string transactionName)
    {
        if ((null == this.TestContext) || !this.TestContext.Properties.Contains("$LoadTestUserContext"))
        {
            return new NoOpTestTransactionTimer();
        }
        return new TestTransactionTimer(this.TestContext, transactionName);
    }


    private TestContext testContextInstance;
    public TestContext TestContext
    {
        get { return testContextInstance; }
        set { testContextInstance = value; }
    }

    //starting User Session
    [DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", "C:\\Path\\Data.csv", "Data#csv", DataAccessMethod.Sequential), DeploymentItem("C:\\Path\\Data.csv"), TestMethod]
    public void smokeTest()
    {
        sUserName = "domain\\"+TestContext.DataRow["user"].ToString();
        sPassword = TestContext.DataRow["password"].ToString();
        prospectClientId = TestContext.DataRow["prospectClientId"].ToString();
        accountNumber = TestContext.DataRow["accountNumber"].ToString();
        correlationId = "startUserSession - " + obj.ToString();

        // Start User Session
        using (this.LogTransaction("t1_startUserSession"))
        {
            ChannelFactory<IAppShellService> cfsus = null;
            try
            {
                using (ChannelBuilder.mPContext(ref appShellServiceClient, "IAppShellService", sUserName, sPassword, 0, null, correlationId, false, effectiveDate, ref cfsus))
                {
                    var userSessionResult = appShellServiceClient.StartUserSession();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
            finally
            {
                cfsus.Close();
            }
        }
    }

【问题讨论】:

标签: c# visual-studio-2015


【解决方案1】:

EndTimer 的唯一调用是在 Dispose 方法中,并且在您的代码中没有显式调用。因此,Dispose 方法只会在垃圾收集器想要调用它时被调用。

我认为您需要添加一个显式调用 EndTimer。也许通过将您的Dispose 方法的调用添加到finally 块中。另见this answer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多