Visual Studio调试/加载速度很慢

Ber*_*hus 488 asp.net-mvc cassini visual-studio iis-express visual-studio-2012

我的智慧结束了.Visual Studio 通常很难调试,或者只是简单地加载("启动而不调试")我的ASP.NET MVC站点.并非总是如此:首先,项目将加载得很好而且速度很快,但是一旦加载速度变慢,它们总是会在此之后加载缓慢.我可以等待1-2分钟或更长时间.

我的设置:

我目前正在使用Visual Studio 2012 Express,但我在Visual Studio 2010 Express中也遇到了同样的问题.我的解决方案存储在网络驱动器上; 具体来说,如果重要的话,它的My Documents会重定向到网络驱动器.(它不应该.有时我的网站在此设置下加载速度非常快.)

我通常在Internet Explorer 9中加载,但在Firefox中也会出现同样的问题.

这可能发生在我工作的任何ASP.NET MVC项目中,它似乎围绕着DisplayTemplates,我的所有ASP.NET MVC项目都是这样做的.而这一切都是C#和Razor,如果重要的话.

症状:

系统将加载我的符号数百次.基本上,以下,但至少有300个这样的行,每个行都有相同的CSHTML的不同的DLL文件:

'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_contact.cshtml.22013bb9.xighmhow.dll', Symbols loaded.
'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_contact.cshtml.22013bb9.cv5hktkf.dll', Symbols loaded.
'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_statuscode.cshtml.22013bb9.1o77hs8i.dll', Symbols loaded.
'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_statuscode.cshtml.22013bb9.jja-77mw.dll', Symbols loaded.
'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_location.cshtml.22013bb9.l_e9ev_s.dll', Symbols loaded.
'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_location.cshtml.22013bb9.b4n59gom.dll', Symbols loaded.
Run Code Online (Sandbox Code Playgroud)

在上面,我有三个DisplayTemplates:"Contact","Location"和"StatusCode".似乎IIS每次调用displaytemplate时都会加载符号两次.因此,如果我显示一个包含100个条目的表,这些条目调用所有这三个displaytemplate,则加载600个单独的符号.

这也不是一个快速的操作.查看IIS生成的日志文件,每个符号加载大约需要200毫秒.因此,超长延迟.

我试过的:

  • 调试版或发布版,没关系.
  • 将我的项目放在Web服务器上的完整IIS实现上可以非常快速地运行它,没有任何问题.
  • Cassini,IIS Express 7.5和IIS Express 8.0都有问题.
  • 删除所有断点不执行任何操作.
  • 清理解决方案,或删除.suo也什么都不做.
  • 如果我修复IIS Express,或删除My Docs\IISExpress文件夹,或修复/重新安装Visual Studio→问题可能会消失,但只有一段时间,然后才会回来.

任何建议都表示赞赏.

要回答更多问题,是的,我的机器肯定有马力.令人愤怒的事情是,同样的项目,改变了NOTHING,有时可以非常快地加载,通常在我修复IIS Express并删除My Docs\IISExpress文件夹之后.最终会发生"某事",再次加载需要2分钟.我正在做的不是一个复杂的项目.没有外部库或依赖项,我的VS.NET没有任何附加组件.

值得注意的是,该机器具有Symantec Endpoint Protection,它具有造成严重破坏的历史.但是直接禁用它(成为管理员很好)并没有解决问题.

我现在有一个理论.我想这都是因为我正在关闭网络共享的重定向文件夹.当调试器经历了数百个"加载符号"行时,我停下来看看它在做什么.这是在我的代码中,加载我有的DisplayTemplate.进入模板输出:

Step into: Stepping over non-user code 'System.Threading.WaitHandle.InternalWaitOne'
Step into: Stepping over non-user code 'System.Threading.WaitHandle.WaitOne'
Step into: Stepping over non-user code 'System.CodeDom.Compiler.Executor.ExecWaitWithCaptureUnimpersonated'
Step into: Stepping over non-user code 'System.CodeDom.Compiler.Executor.ExecWaitWithCapture'
Step into: Stepping over non-user code 'Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch'
Step into: Stepping over non-user code 'Microsoft.CSharp.CSharpCodeGenerator.System.CodeDom.Compiler.ICodeCompiler.CompileAssemblyFromFileBatch'
Step into: Stepping over non-user code 'System.Web.Compilation.AssemblyBuilder.Compile'
'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_statuscode.cshtml.22013bb9.bciuyg14.dll', Symbols loaded.
Step into: Stepping over non-user code 'System.Web.Compilation.BuildManager.CompileWebFile'
Step into: Stepping over non-user code 'System.Web.Compilation.BuildManager.GetVPathBuildResultInternal'
Step into: Stepping over non-user code 'System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert'
Step into: Stepping over non-user code 'System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory'
Step into: Stepping over non-user code 'System.Web.Mvc.BuildManagerWrapper.System.Web.Mvc.IBuildManager.FileExists'
Step into: Stepping over non-user code 'System.Web.Mvc.VirtualPathProviderViewEngine.GetPathFromGeneralName'
Step into: Stepping over non-user code 'System.Web.Mvc.VirtualPathProviderViewEngine.FindPartialView'
Step into: Stepping over non-user code 'System.Web.Mvc.ViewEngineCollection.Find'
Step into: Stepping over non-user code 'System.Web.Mvc.ViewEngineCollection.FindPartialView'
Step into: Stepping over non-user code 'System.Web.Mvc.Html.TemplateHelpers.ActionCacheViewItem.Execute'
'iisexpress.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\b63f8236\6775085d\App_Web_statuscode.cshtml.22013bb9.kwj3uqan.dll', Symbols loaded.
Step into: Stepping over non-user code 'System.RuntimeType.CreateInstanceSlow'
Step into: Stepping over non-user code 'System.Web.Mvc.DependencyResolver.DefaultDependencyResolver.GetService'
Step into: Stepping over non-user code 'System.Web.Mvc.BuildManagerViewEngine.DefaultViewPageActivator.Create'
Step into: Stepping over non-user code 'System.Web.Mvc.BuildManagerCompiledView.Render'
Run Code Online (Sandbox Code Playgroud)

看起来Visual Studio 每次调用时都会重新编译我的displaytemplate ,这也是数百次.我的理论是Visual Studio编译文件,将其保存到网络共享,网络共享然后以某种方式在其上标记新的时间,然后Visual Studio认为文件已更改,因此Visual Studio再次重新编译它.但只有一个理论; 我真的不知道.

首先,显然我有脱机文件(这是办公室里的台式电脑;我不在乎).我明天要禁用,重启和重试.

另外,将我的项目按原样移动到本地C:修复它.它加载速度非常快.但这在工作环境中并不理想.我丢失了以前的版本,我的代码根本没有备份,除非我手动复制它,并且它不再与任何人共享.

如果涉及它,我可以将它从C来回复制到网络共享.每个页面加载等待两分钟会更烦人.

小智 625

以下是我在Visual Studio 2012中解决"慢符号加载"问题的方法:

  • 转到工具 - >选项 - >调试 - >常规

  • 选中"启用我的代码"旁边的复选标记.

  • 转到工具 - >选项 - >调试 - >符号

  • 单击"..."按钮,在本地计算机上的某处创建/选择一个新文件夹以存储缓存的符号.我将其命名为"符号缓存"并将其放在Documents - > Visual Studio 2012中.

  • 单击"加载所有符号"并等待从Microsoft的服务器下载符号,这可能需要一段时间.请注意,"加载所有符号"按钮仅在调试时可用.

  • 取消勾选"Microsoft Symbol Servers"旁边的复选标记,以防止Visual Studio远程查询Microsoft服务器.

  • 单击"确定".

从现在开始,符号加载应该快得多.

请注意,如果对Microsoft程序集进行任何更改/下载,则可能需要再次返回"符号"对话框和"加载所有符号".

  • 这里有按钮的解决方案加载所有符号禁用:按钮仅在调试时可用. (85认同)
  • 对我来说没有问题,我很害怕.对于那些围绕Microsoft符号问题的人来说,这将是一个很好的解决方案.不幸的是,我的问题似乎围绕着我自己的符号.这些符号已经在本地缓存,并且出于某种原因,仅在一个页面加载中编译了数百个瓦片. (31认同)
  • 即使按照您的步骤操作,"加载所有符号"按钮也会隐藏,我无法点击它.我现在应该怎么做?我正在使用VS Express 2012. (16认同)
  • @ChrisMcGrath试试这个链接http://social.msdn.microsoft.com/Forums/en-US/vsdebug/thread/a29b4a2c-44e5-47af-bdf9-90c4c928649d/.顺便说一句,谢谢你的答案 (14认同)
  • 感谢这个提示我在这里遇到的一个问题是加载所有符号按钮对我来说是否有任何想法? (8认同)
  • 太棒了,也为我修好了.我刚刚转过所有这些符号的东西来逐步完成MVC源代码 (2认同)
  • 我在哪里寄给你一笔薪水,为我节省了不可思议的时间? (2认同)
  • 这对我没有帮助.我发现以下解决方案适合我.选择删除所有断点:http://stackoverflow.com/questions/3377720/visual-studio-loading-symbols/3759864#3759864 (2认同)

mok*_*oke 110

关闭intelliTrace为我解决了这个问题.

在Visual Studio中,工具 - >选项 - > IntelliTrace

然后,取消选中"启用IntelliTrace"复选框.

在Visual Studio 2012中禁用IntelliTrace

  • 在Visual Studio 2015中,Intellitrace仅存在于VS 2015 Enterprise Edition中. (7认同)
  • 无法在Tools => Options中找到Intellitrace...我有vsComunity 2015 (6认同)
  • 单步测试时,我遇到了这个问题.打开intellitrace大约需要300秒,关闭时大约需要14秒.这个修复对我来说真的很有用. (2认同)
  • 将我的启动从25秒改进到6.我觉得它有很大帮助,因为我在应用程序启动时运行了很多自己的代码 (2认同)
  • 该死的...从1分钟到10秒.它在VS2012 Ultimate中默认选中.小心一下 (2认同)

小智 78

这些都不适合我,但我在删除的符号上找到了一个断点.似乎2010年就是它.要查看这是否是您的问题,请执行debug-> windows-> breakpoints如果有任何内容,请删除它们.

桑德斯提到他检查了这一点,但在这个问题的解决方案中没有提到.也许是某些人的常识,但不是我们所有人.

  • 我突然在VS2010中开始遇到这个问题,而且确实是我的一个断点导致它.一旦我清除断点,它就会再次变快. (5认同)
  • 哇..VS2012正在爬行,5分钟只是为了建立一个简单的项目.清除所有断点,再次快速闪电,谢谢!! (3认同)
  • 这也适用于我在Visual Studio 2015中的慢调试问题. (2认同)

小智 40

我删除了"Temporary ASP.NET Files"文件夹,我的localhost页面加载得到了显着改善.这是路径...%temp%\ Temporary ASP.NET Files \

  • C:\ Users\{USER_NAME}\AppData\Local\Temp是路径,"AppData"文件夹是隐藏文件夹 (8认同)
  • 我在这里发现了 1GB 的旧垃圾....全部删除,VS 运行得更好一点。:) (2认同)

小智 28

我遇到了同样的问题并尝试了上面的大部分决议.简单地删除缓存和临时文件最终会为我工作.

尝试删除这两个文件夹的内容:

C:\Users\\{UserName}\AppData\Local\Microsoft\WebsiteCache
Run Code Online (Sandbox Code Playgroud)

C:\Users\\{UserName}\AppData\Local\Temp (特别是iisexpress和Temporary ASP.NET Files文件夹).

通过将cmd文件添加到C:\Users\\{username}\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup具有以下内容的文件夹,可以将此设置为在登录到Windows时自动执行:

rmdir C:\Users\\{username}\AppData\Local\Microsoft\WebsiteCache /s /q

rmdir C:\Users\\{username}\AppData\Local\Temp /s /q
Run Code Online (Sandbox Code Playgroud)

  • 这是一个!它运行良好,我现在在登录Windows时自动实现:我已将一个名为DeleteVisualStudioCache.cmd的文件添加到C:\ Users\{username}\AppData\Roaming\Microsoft\Windows\Start Menu\Programs \使用以下命令启动:rmdir C:\ Users\{username}\AppData\Local\Microsoft\WebsiteCache/s/q rmdir C:\ Users\{username}\AppData\Local\Temp/s/q pause (3认同)

rka*_*ano 28

你启用了FusionLog吗?

我的VisualStudio启动非常慢,打开解决方案并在开始调试时加载符号.它只在我的机器上很慢,但在其他机器上却没有.

FusionLog将大量日志内容写入磁盘.在我的案例中,只是在RegEdit上禁用它解决了所有问题.

这是注册表上的FusionLog密钥:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion
Run Code Online (Sandbox Code Playgroud)

检查ForceLog值(1启用,0禁用).

  • @ChristopherD.Emerson 如果您没有看到这个键,那么您肯定还没有启用 fusionlog。 (3认同)

Ber*_*hus 25

我想我最终可能至少知道原因,但不是原因.当问题再次出现时,我注意到大量的"conhost.exe"进程孤立了.我会关闭Visual Studio,它们会保持开放状态.他们每个人的结束任务终于可靠地解决了这个问题.[希望]

(请注意,虽然Visual Studio使用它,但conhost.exe不是Visual Studio进程.因此,其他用户可能还有其他运行conhost.exe的应用程序.我知道我的机器不是我可以的原因安全地结束所有这些任务,但YMMV.)

至于为什么会这样?这似乎发生在我同时打开多个项目时,我倾向于经常这样做,即使我只是随时构建和调试其中一个项目.


编辑#1 - 不幸的是,这不是一个"银弹".它并不总是对我有用.通常,当事情变慢时,我只关闭所有Visual Studio会话,然后进入任务管理器并结束它的任何实例,conhost.exe,iisexpress.exe Microsoft.VisualStudio.Web.Host.exe和MSBuild.exe我可以找到.

通常,在那之后,当我重新启动我的项目时,它会快速加载.但不总是.

真的,我认为最好的做法可能是不在重定向的文件夹/网络共享上构建和调试代码.


编辑#2 - 两年后,在Visual Studio社区2013中,这仍然是一个问题,但我似乎至少找到了罪魁祸首任务:Explorer.exe.是的,谁知道.我结束那个任务的那一刻,bam,页面加载一秒钟.

如果我有一个Windows资源管理器文件浏览器打开我的重定向网络驱动器(这通常是我的代码所在的位置),似乎会出现此问题.关闭窗口是不够的,我必须杀死整个Explorer.exe任务.我只能猜到它在做什么......用文件句柄搞定?

我通常可以使用任务管理器来启动一个新的explorer.exe任务(我只能采取这么多alt-tabbing),并且Visual Studio将继续加载漂亮和快速.但是,如果我再次打开Windows资源管理器,它几乎总是回到超慢速.

因此,如果您有重定向的网络共享,请试一试.它肯定胜过当地的工作.


Tah*_*san 22

以上都是很好的解决方案,我尝试了所有这些,但在这里得到了解决方案,即

Debug -> Delete All Breakpoints
Run Code Online (Sandbox Code Playgroud)


DMa*_*n51 19

对我来说,它是IE 9.08.8112.16241.一旦我使用Firefox或Chrome,就没有F10或F11的缓慢调试.我不知道IE的问题是什么,但我正式鄙视现在使用它进行测试.

更新:我已关闭所有IE程序加载项,它已恢复全速.一次打开一个,发现LastPass(在我的情况下)是罪魁祸首.我想我毕竟不会责怪MS.

  • 这也解决了我的问题.我在尝试调试时获得了完整的系统锁定,尤其是在使用QuickWatch窗口时.需要禁用LastPass工具栏.(IE 10.0.9200.16635) (2认同)
  • 这就是我喜欢 StackOverflow 的原因。但 LastPass 应该可以解决这个问题 - 我现在正在给他们发电子邮件让他们知道。VS2013和IE 11显然还是有问题。禁用LastPass又恢复正常。感谢 UserBlueOne 提供的信息 - 可以再次继续工作。 (2认同)
  • 可怕的最后一关!当使用我的 MVC 应用程序在 VS 2012 中进行调试时,我的键盘完全被塞满了。禁用 LastPass 后一切又恢复正常。谢谢!已投赞成票。 (2认同)

Kor*_*yem 14

对我来说,我实现了这个技巧,它通过在web.config中为编译标记添加以下两个属性,基本上大大提高了性能

<compilation ... batch="false" optimizeCompilations="true"> ... </compilation>
Run Code Online (Sandbox Code Playgroud)

batch ="false"有什么作用?

它通过仅编译已更改并需要重新编译的页面,使预编译更具选择性

optimizeCompilations究竟在做什么?资源

ASP.NET使用每个应用程序哈希代码,其中包括许多内容的状态,包括bin和App_Code文件夹以及global.asax.每当ASP.NET应用程序域启动时,它都会检查此哈希代码是否已从之前计算的更改.如果有,则整个codegen文件夹(编译和阴影复制的程序集处于活动状态)将被清除.

当启用此优化(通过optimizeCompilations ="true")时,哈希不再考虑bin,App_Code和global.asax.因此,如果这些更改我们不会消灭codegen文件夹.

参考:msdn上的编译元素

  • 感谢您的发表.这实际上比接受的答案更能提高我的表现. (2认同)

ark*_*nia 12

我也有调试执行性能问题,我尝试了很多调试器选项.在我的情况下,当我改变这个选项时实现了巨大的性能:

工具 - 选项 - 调试 - 输出窗口 - (常规输出设置 - 所有调试输出) - 关闭


sha*_*p00 12

在我的例子中,它是带有VS 2012的.NET Reflector Visual Studio扩展(版本8.3.0.93).每次跳过调试(F10)需要10秒.

在Visual Studio中,转到" 工具/扩展和更新..."并禁用.NET Reflector Visual Studio扩展.不要忘记重新启动Visual Studio.


Pau*_*nis 11

启用"Native Code"调试器时,我遇到了Visual Studio调试速度慢的问题.尝试禁用它.

在"Visual Studio 2012"上转到:

  1. 项目属性 - >
  2. 网 - >
  3. 调试器(页面底部). - >
  4. 禁用除ASP.NET以外的所有

希望能帮助到你.

类似的问题:1,2


tod*_*dmo 11

就我而言

Tools/Options/Debugging/General/Enable JavaScript debugging for ASP.NET (Chrome and IE)
Run Code Online (Sandbox Code Playgroud)

一旦我取消选中此项,我的调试开始时间从45-60秒下降到0-5秒.


Lar*_*rry 10

有一次,在断电后,每次遇到断点或抛出异常时,我都不得不面对同样的慢速问题.

我有一个模糊的记忆,"suo"文件(与"sln"解决方案文件在同一目录中)可能会被破坏并使一切变慢.

在此输入图像描述

我删除了我的"suo"文件,一切都很好..suo文件删除是无害的,只是意味着重新创建我的Windows布局加上启动项目和一些其他非关键自定义.


Gee*_*nja 10

我也面临这个问题,下面是我执行的步骤,它始终适用于我:

  • 删除解决方案的.suo文件.
  • 删除临时ASP.NET文件 (您可以在%WINDOW%\ Microsoft.NET\Framework \\ Temporary ASP.NET Files中找到它)
  • 删除应用程序中的所有断点.


And*_*vis 9

我不知道你是否还有这个问题,但是我通过将调试器附加到进程本身来调试Visual Studio中的站点,而不是让VS为我做这些,我发现它可以大大缩短时间.我使用VS的扩展名为AttachTo,我在这里有一篇关于如何使用它的小文章.

我希望这有帮助.


Sal*_*lty 7

通过禁用浏览器链接解决了我的慢VS问题

在此输入图像描述


小智 6

如果有人注意到左侧字段中出现此行为,请检查以确保您没有在web.config中设置任何断点.我必须设置一个鼠标点击鼠标,它确实减慢了所有调试操作.


I.G*_*ual 6

花了一整天等待符号加载与龟速一样慢,混合和切换所有可能的组合:Just My Code,Caching symbols,Intellitrace,Just-In-Time,kill processes等.

我的解决方案实际上是禁用防病毒软件.是的,Windows Defender正在放慢我的项目启动速度!它将检查Visual Studio请求它们的所有dll并减慢整个符号加载过程.

我不得不说我们的机器有很好的规格来快速编译解决方案,所以这绝不是问题.我们在VS 2013 Ultimate中编码.


Dim*_* C. 5

清空符号缓存对我有用.

请参阅:菜单栏/工具/选项/调试/符号/空符号缓存


MCS*_*MCS 5

在 Visual Studio 中:

工具 -> 选项 -> 调试 -> 符号

选择“仅指定模块”。单击“指定模块”链接,并添加一个空白模块(单击新文档按钮并点击确定)。


tra*_*mer 5

清除高速缓存等使用选项12; 用于设置/故障排除选项34,享受!

选项1导航到 IIS express ,清除缓存和站点

cd "C:\Program Files (x86)\IIS Express\"
Run Code Online (Sandbox Code Playgroud)
  • 运行这个 appcmd.exe list site /xml | appcmd delete site /in
  • 运行这个Del /S /F /Q %temp%- 清除 Userprofile Temp 文件夹。
  • 运行这个 Del /S /F /Q %Windir%\Temp

此外,清除您的临时文件%temp%并注销,或重新启动

这将清除 Windows 临时文件夹。这将删除所有网站,享受!


选项 2:删除/重新创建临时文件夹

  • 命令> rmdir C:\Users\\{username}\AppData\Local\Microsoft\WebsiteCache /s /q
  • 命令> rmdir C:\Users\\{username}\AppData\Local\Temp /s /q

选项3来自 MSDN 的JMC(仅我的代码)选项

要在 Visual Studio 中启用或禁用仅我的代码,under Tools > Options (or Debug > Options) > Debugging > General, select or deselect Enable Just My Code.

在此处输入图片说明


选项4配置 Visual Studio/禁用常见插件问题

更多的Visual Studio 设置 您还可以配置 Visual Studio 并禁用环境中的资源清除功能,不记得我从哪里得到的,但我很快会发布更多。

环境 -> 一般

  • 取消选中“根据客户端性能自动调整视觉体验”
  • 取消选中“启用富客户端视觉体验”选中“如果可用,使用硬件图形加速”环境-> 自动恢复
  • 取消选中“每隔一段时间保存自动恢复信息”
  • 环境 -> 文档
  • 选中“当数据无法保存在代码页中时将文档另存为 Unicode”环境 -> 键盘
  • 将“ForceGC”设置为 ctrl+num1
  • 将“ReSharper_Toggle”设置为 ctrl+num0(如果使用 ReSharper)
  • 将“ReSharper_EnableDaemon”设置为 ctrl+num8(如果使用 ReSharper)环境 -> 启动
  • 将“启动时”设置为“启动时显示空环境”
  • 取消选中“每隔一段时间下载内容”环境 -> 同步设置
  • 取消选中“登录 Visual Studio 时跨设备同步设置”


归档时间:

查看次数:

285432 次

最近记录:

6 年 前