Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于循环的Azure云服务在生产中比在本地主机上慢得多_C#_Performance_Azure_Asp.net Web Api_Azure Cloud Services - Fatal编程技术网

C# 用于循环的Azure云服务在生产中比在本地主机上慢得多

C# 用于循环的Azure云服务在生产中比在本地主机上慢得多,c#,performance,azure,asp.net-web-api,azure-cloud-services,C#,Performance,Azure,Asp.net Web Api,Azure Cloud Services,由于某些原因,这段特定代码在生产服务器(即XL Azure云服务)上的运行速度比在本地主机上慢得多。最糟糕的是,这种慢度并不一致,也就是说,大多数时候慢,但有时工作得很快。我所说的慢,是指这段代码在生产环境中运行需要4.000ms(我知道这一点,因为我使用的是Azure AppInsights),而在本地主机上只需要大约60ms。我不明白为什么会这样。下面是代码(请注意,这只是Biger方法的一部分,但我确信这部分速度最慢,其他部分速度更快): for(变量i=0;ir.TreningId==w

由于某些原因,这段特定代码在生产服务器(即XL Azure云服务)上的运行速度比在本地主机上慢得多。最糟糕的是,这种慢度并不一致,也就是说,大多数时候慢,但有时工作得很快。我所说的慢,是指这段代码在生产环境中运行需要4.000ms(我知道这一点,因为我使用的是Azure AppInsights),而在本地主机上只需要大约60ms。我不明白为什么会这样。下面是代码(请注意,这只是Biger方法的一部分,但我确信这部分速度最慢,其他部分速度更快):

for(变量i=0;ir.TreningId==workoutGuid&&r.UserId==UserId)!=null;
秒表2.Stop();
telemetryHelper.TrackEvent(\u telemetryClient,
“CreateRedisFeedViewModelAsync:转到DB进行训练”,秒表2;
}
管柱长度;
如果(锻炼长度>=3600)
{
var t=从秒开始的时间跨度(训练长度);
workoutLength=$“{t.Hours:D2}:{t.Minutes:D2}:{t.Seconds:D2}”;
}
其他的
{
var t=从秒开始的时间跨度(训练长度);
workoutLength=$“{t.Minutes:D2}:{t.Seconds:D2}”;
}
listToReturn.Add(新的FeedMobileHelper
{
Id=feedDeserialized[i]。Id.ToString(),
UserId=workout.UserId,
WorkUtid=feedDeserialized[i]。WorkUtid,
积分=训练。积分。ToString(“N0”,新编号格式信息
{
numbergroupsize=new[]{3},
NumberGroupSeparator=“”
}),
WorkoutName=锻炼。名称,
修井长度=修井长度,
NumberOfAspects=锻炼。NumberOfAspects,
NumberOfComments=训练。NumberOfComments,
WorkoutComment=WorkoutComment,
尊敬的,尊敬的,
UserImageUrl=profilePic,
用户名=用户名,
DisplayName=string.IsNullOrWhiteSpace(全名)?用户名:全名,
时间戳=训练。完成时的日期,
DateFormatted=workout.DateWhenFinished.FormattDateTohrsDaysWeeksString()
});
}
我无法理解为什么这需要4秒钟才能完成8核15 GB内存的云服务,特别是因为这里没有什么特别的东西,没有数据库访问(正如我在评论中指出的,代码的“其他部分”永远不会执行)或光盘,一切都在内存中完成。循环中的大多数事情都是在恒定时间内完成的-O(1)。请任何人帮我找出这里的问题

还有一件事,执行这部分代码的API调用不是由1000多个用户同时调用的,它只是由我调用的(我确信这一点)

附言


feedDeserialized.Length大约为60

首先想到的是-您是否正在将调试或发布版本部署到Azure云服务?发布版本经过优化,速度更快。如果右键单击云服务并选择发布…,则可以选择要部署的构建。此外,您可能希望启用分析(在发布向导的“高级设置”下),以查看应用程序的慢速部分

for (var i = 0; i < feedDeserialized.Length; i++)
{
RedisWorkoutItem workout;
bool hasRespected;
string username, fullName, profilePic;

// usersFromRedis is  an array of Dictonary <string,string>
var userRedis = usersFromRedis[i];
// workoutsFromRedis is just an array of objects - RedisValue object
var stringWorkout = workoutsFromRedis[i];
// just an array of objects - RedisValue object
var workoutComment = commentsFromRedis[i].HasValue ? commentsFromRedis[i].ToString() : "";

if (userRedis != null)
{
    profilePic = userRedis["ProfilePhotoUrl"].HasValue
        ? userRedis["ProfilePhotoUrl"].ToString()
        : "";
    fullName = userRedis["FirstName"] + " " + userRedis["LastName"];
    username = userRedis["UserName"].HasValue ? userRedis["UserName"].ToString() : "";
}
//code inside this else statement never happens
else
{
    var stopWatch2 = new Stopwatch();
    stopWatch2.Start();
    var user = databaseContext.Users.Find(feedDeserialized[i].UserId);
    profilePic = user.ProfilePhotoUrl;
    username = user.UserName;
    fullName = user.FirstName + " " + user.LastName;
    stopWatch2.Stop();
    telemetryHelper.TrackEvent(_telemetryClient,
        "CreateRedisFeedViewModelAsync: Went to DB for user", stopWatch2.Elapsed);
}

if (stringWorkout.HasValue)
{
    workout = JsonConvert.DeserializeObject<RedisWorkoutItem>(stringWorkout);
    hasRespected = workout.UsersWhoRespected.Contains(userId);
}
//code inside this else statement never happens
else
{
    var stopWatch2 = new Stopwatch();
    stopWatch2.Start();
    var workoutGuid = Guid.Parse(feedDeserialized[i].WorkoutId);

    var workoutFromDb = await databaseContext.Trenings.FindAsync(workoutGuid);
    var routine = await databaseContext.AllRoutineses.FindAsync(workoutFromDb.AllRoutinesId);
    workout = new RedisWorkoutItem
    {
        Name = routine.Name,
        Id = workoutFromDb.TreningId.ToString(),
        Comment = workoutFromDb.UsersCommentOnWorkout,
        DateWhenFinished = workoutFromDb.DateTimeWhenTreningCreated,
        NumberOfRespects = workoutFromDb.NumberOfLikes,
        NumberOfComments = workoutFromDb.NumberOfComments,
        UserId = workoutFromDb.UserId,
        Length = workoutFromDb.LengthInSeconds,
        Points = workoutFromDb.Score
    };

    workoutComment = workoutFromDb.UsersCommentOnWorkout;


    hasRespected = databaseContext.TreningRespects
        .FirstOrDefault(r => r.TreningId == workoutGuid && r.UserId == userId) != null;

    stopWatch2.Stop();
    telemetryHelper.TrackEvent(_telemetryClient,
        "CreateRedisFeedViewModelAsync: Went to DB for workout", stopWatch2.Elapsed);
}

string workoutLength;

if (workout.Length >= 3600)
{
    var t = TimeSpan.FromSeconds(workout.Length);
    workoutLength = $"{t.Hours:D2}:{t.Minutes:D2}:{t.Seconds:D2}";
}
else
{
    var t = TimeSpan.FromSeconds(workout.Length);
    workoutLength = $"{t.Minutes:D2}:{t.Seconds:D2}";
}


listToReturn.Add(new FeedMobileHelper
{
    Id = feedDeserialized[i].Id.ToString(),
    UserId = workout.UserId,
    WorkoutId = feedDeserialized[i].WorkoutId,
    Points = workout.Points.ToString("N0", new NumberFormatInfo
    {
        NumberGroupSizes = new[] {3},
        NumberGroupSeparator = "."
    }),
    WorkoutName = workout.Name,
    WorkoutLength = workoutLength,
    NumberOfRespects = workout.NumberOfRespects,
    NumberOfComments = workout.NumberOfComments,
    WorkoutComment = workoutComment,
    HasRespected = hasRespected,
    UserImageUrl = profilePic,
    UserName = username,
    DisplayName = string.IsNullOrWhiteSpace(fullName) ? username : fullName,
    TimeStamp = workout.DateWhenFinished,
    DateFormatted = workout.DateWhenFinished.FormatDateToHrsDaysWeeksString()
});
}