我有一些相对简单的交易针对我的应用程序运行,例如"启动用户会话"通过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();
}
}
}
答案 0 :(得分:0)
EndTimer
的唯一调用位于Dispose
方法中,并且未在代码中明确调用。因此,只有当垃圾收集器想要调用它时才会调用Dispose
方法。
我相信您需要添加EndTimer
的显式调用。也许通过将Dispose
方法的调用添加到finally
块中。另请参阅this answer。