cuốn sách gpt4 ai đã làm

Phân tích mức sử dụng CPU cao của trang web dược phẩm và thương mại điện tử .NET

In lại Tác giả: Sahara Thời gian cập nhật: 2024-12-30 12:42:57 56 4
mua khóa gpt4 Nike

1: Bối cảnh

1. Kể chuyện

Chúng tôi dự định xây dựng lại các khóa đào tạo về gỡ lỗi nâng cao .NET vào năm tới để áp dụng cách tiếp cận theo từng trường hợp. Nhiều loại vụ nổ CPU là những lập trình viên không chú ý đến độ phức tạp về thời gian khi viết mã. Tình huống trực tiếp biến thành một vòng lặp vô hạn. Độ phức tạp về thời gian là một phần của khóa học cấu trúc dữ liệu của trường. Những người bạn quan tâm phải suy nghĩ kỹ về nó khi viết các vòng lặp nhiều lớp. Hôm nay tôi sẽ mang đến cho bạn một trường hợp thuộc loại này. có thể coi là Tiếp tục làm phong phú thêm hệ thống chương trình giảng dạy mới của tôi.

Vài ngày trước, một người bạn đến gặp tôi và nói rằng trang web của họ sẽ có CPU cao đột ngột. Sau khi tìm kiếm thông tin liên quan trên Internet, cuối cùng anh ấy cũng tìm thấy tôi ở đây. Anh ấy muốn tôi giúp phân tích chuyện gì đang xảy ra? Đối với CPU cao đột ngột như vậy, cách tốt hơn là sử dụng procdump để tự động chụp nó. Tiếp theo, hãy sử dụng Windbg để phân tích.

2: Phân tích WinDbg

1. Tại sao CPU lại phát nổ?

Hãy bắt đầu với mục đích cuối cùng, trước tiên hãy kiểm tra xem CPU có thực sự cao hay không. Bạn có thể sử dụng các lệnh !tp và !cpuid để quan sát. Sau đây là một đề cập ngắn gọn, tại sao bạn cần sử dụng !cpuid để kiểm tra khả năng của CPU? Điều này là do tôi đã từng phân tích một CPU chỉ có 2 lõi. Chết tiệt, chỉ có 2 nhân thôi, phân tích cũng không đơn giản nên cứ tắt máy là CPU không cao. . . Kể từ đó, tôi đã để mắt đến nó và tài liệu tham khảo đầu ra như sau:


0:033> !tp CPU utilization: 100% Worker Thread: Total: 5 Running: 5 Idle: 0 MaxLimit: 32767 MinLimit: 4 Work Request in Queue: 11 Unknown Function: 00007ffbfaa417d0 Context: 00000283733c3718 Unknown Function: 00007ffbfaa417d0 Context: 0000027f26f50cb0 Unknown Function: 00007ffbfaa417d0 Context: 0000028377199f58 AsyncTimerCallbackCompletion TimerInfo@0000028371c46820 AsyncTimerCallbackCompletion TimerInfo@0000028371d06800 Unknown Function: 00007ffbfaa417d0 Context: 00000283756d3248 Unknown Function: 00007ffbfaa417d0 Context: 0000027f26f63578 Unknown Function: 00007ffbfaa417d0 Context: 00000283733d0160 Unknown Function: 00007ffbfaa417d0 Context: 00000283756a72d8 Unknown Function: 00007ffbfaa417d0 Context: 00000283771a6828 Unknown Function: 00007ffbfaa417d0 Context: 000002837719d1f8 -------------------------------------- Number of Timers: 0 -------------------------------------- Completion Port Thread:Total: 3 Free: 2 MaxFree: 8 CurrentLimit: 2 MaxLimit: 1000 MinLimit: 4 0:033> !cpuid CP F/M/S Manufacturer MHz 0 6,106,6  2800 1 6,106,6  2800 2 6,106,6  2800 3 6,106,6  2800

从卦中可以看出当前线程池队列稍有积压,5个托管线程全部被打满,并且当前机器是4个核,看样子是有4个线程在满负荷跑呀。。.

2. 线程都在干什么

为了追踪线程都在干什么?使用 ~*e !clrstack 观察各个线程的调用栈,结合程序的瞬高特性,捕获了一个相对来说高度可疑的代码,参考如下:


Id chủ đề hệ điều hành: 0x2f00 (33) Trang web cuộc gọi IP SP con 000000f2a42fd508 00007ffbfd72b0a7 System.String.Equals(System.String, System.String) [f:\dd\ndp\clr\src\BCL\system\string.cs @ 647 ] 000000f2a42fd510 00007ffba1715a0b xxx.StockAsyncDbTask+c__DisplayClass4_1.b__6(xxx.GoodsInfo) 000000f2a42fd540 00007ffba118c6ca System.Linq.Enumerable.FirstOrDefault[[System.__Canon, mscorlib]](System.Collections.Generic.IEnumerable`1, System.Func`2) 000000f2a42fd5b0 00007ffba1716008 xxx.StockAsyncDbTask+c__DisplayClass4_0.b__2(xxx.GoodsInfo) 000000f2a42fd670 00007ffbfd720505 System.Collections.Generic.List`1[[System.__Canon, mscorlib]].ForEach(System.Action`1) [f:\dd\ndp\clr\src\BCL\system\collections\generic\list.cs @ 553] 000000f2a42fd6c0 00007ffba1349e7e xxx.SaveStockToDb() 000000f2a42fd760 00007ffba13487ed xxx.DoWork() 000000f2a42fd7b0 00007ffba1348631 xxx.QuartzScheduler.QuartzJob.Quartz.IJob.Execute(Quartz.IJobExecutionContext) 000000f2a42fd8b0 00007ffba0f8ca12 Quartz.Core.JobRunShell+d__9.MoveNext() 000000f2a42fdb80 00007ffba0f83150 System.Runtime.CompilerServices.AsyncTaskMethodBuilder.Start[[Quartz.Core.JobRunShell+d__9, Quartz]](d__9 ByRef) [f:\dd\ndp\clr\src\BCL\system\runtime\compilerservices\AsyncMethodBuilder.cs @ 322] 000000f2a42fdc30 00007ffba0f8309d Quartz.Core.JobRunShell.Run(System.Threading.CancellationToken) 000000f2a42fdd30 00007ffba0f829f4 Quartz.Core.QuartzSchedulerThread+c__DisplayClass28_0.b__0() 000000f2a42fdd60 00007ffbfd7abe4e System.Threading.Tasks.Task`1[[System.__Canon, mscorlib]].InnerInvoke() [f:\dd\ndp\clr\src\BCL\system\threading\Tasks\Future.cs @ 680] 000000f2a42fddb0 00007ffbfd7aaf27 System.Threading.Tasks.Task.Execute() [f:\dd\ndp\clr\src\BCL\system\threading\Tasks\Task.cs @ 2498] 000000f2a42fddf0 00007ffbfd73df12 System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) [f:\dd\ndp\clr\src\BCL\system\threading\executioncontext.cs @ 980] 000000f2a42fdec0 00007ffbfd73dd95 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading. ngữ pháp cảnhGọi lại, System.Object, Boolean) [f:\dd\ndp\clr\src\BCL\system\threading\executioncontext.cs @ 928] 000000f2a42fdef0 00007ffbfd7ab1e1 System.Threading.Tasks.Task.ExecuteWithThreadLocal(System.Threading.Tasks.Task ByRef ) [f:\dd\ndp\clr\src\BCL\system\threading\Tasks\Task.cs @ 2827] 000000f2a42fdfa0 00007ffbfd7aa8c1 System.Threading.Tasks.Task.ExecuteEntry(Boolean) [f:\dd\ndp\clr\src\BCL\system\threading\Tasks\Task.cs @ 2767] 000000f2a42fdfe0 00007ffbfd708e46 System.Threading.ThreadPoolWorkQueue.Dispatch() [f:\dd\ndp\clr\src\BCL\system\threading\threadpool.cs @ 820]

Hãy tìm kiếm vấn đề dựa trên cách hiển thị trong thẻ. Để bảo vệ quyền riêng tư của khách hàng, ở đó. đây sẽ hơi mờ nhạt, chủ yếu là nhìn vào cấu trúc khung xương của phức tạp.

Nhặp for, vì thời gian phức tạp như vậy là O(N3). người bạn đã nghiên cứu về cấu trúc dữ liệu và thuật toán nên biết rằng tốc độ phức tạp này không thể được và sẽ đi ngược lại với đường .

3. O(N3) có phải là lời nói không?

Nếu bạn muốn biết dữ liệu O(N3) phải là nguyên nhân cốt lõi hay không, bạn phải kiểm tra xem nó có được thụ tinh và đảo hay không liên tục lộn ngược hay không.


0:033> !dso OS Thread Id: 0x2f00 (33) RSP/REG đối tượng rbx 0000028227b4be70 xxx.GoodsInfo 000000F2A42FD520 0000028029c02038 System.Collections.Generic.List`1[[xxx.GoodsInfo, xxx.Model]] ... 000000F2A42FD708 0000027f277d3de8 System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[xxx_DataGrab, xxx.Data] ] 0:033> !do 0000027f277d3de8 Tên: System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[xxx_DataGrab,xxx.Data]] MethodTable: 00007ffba12b82f8 EEClass: 00007ffbfd345c10 Kích thước: 80(0x50) byte Tệp: C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll Các trường: Loại bù trừ trường MT Tên giá trị Attr VT 00007ffbfd1d8538 4001887 8 System.Int32[] 0 phiên bản 0000027f27d51328 nhóm 00007ffbfe422618 4001888 10 ...non, mscorlib]][] 0 phiên bản 0000027f27d51350 00007ffbfd1d85a0 4001889 38 System.Int32 1 phiên bản 1 phiên bản 00007ffbfd1d85a0 400188b phiên bản 40 System.Int32 1 phiên bản -1 freeList 00007ffbfd1d85a0 400188c 44 System.Int32 1 phiên bản 0 freeCount 00007ffbfd1c7790 400188d 18 ...Canon, mscorlib]] 0 phiên bản 00000282274c1978 so sánh 00007ffbfd1c57c0 400188e 20 ...Canon, mscorlib]] 0 phiên bản 0000027f27cfc630 khóa 00007ffbfd1eef60 400188f 28 ...Canon, mscorlib]] 0 phiên bản 00000000000000000 giá trị 00007ffbfd1d5dd8 4001890 30 System.Object 0 phiên bản 0000000000000000 _syncRoot 0:033> !do 0000028029c02038 Tên: System.Collections.Generic.List`1[[xxx, xxx.Model]] MethodTable: 00007ffba126e830 EEClass: 00007ffbfd362af8 Kích thước: 40(0x28) byte File: C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll Các trường: Loại bù trừ trường MT Tên giá trị Attr VT 00007ffbfd1ee250 40018a0 8 System.__Canon[] 0 phiên bản 00000283278195b0 _items 00007ffbfd1d85a0 40018a1 18 System.Int32 1 phiên bản 21863 _size 00007ffbfd1d85a0 40018a2 1c System.Int32 1 phiên bản 0 _version 00007ffbfd1d5dd8 40018a3 10 phiên bản bản System.Object 0 0000000000000000 _syncRoot 00007ffbfd1ee250 40018a4 8 System.__Canon[] 0 tĩnh 

Từ que, chúng ta có thể tìm thấy từ điển ở cấp độ đầu tiên chỉ có 1 bản ghi, Danh sách ở cấp độ thứ hai có tới 2,1w data và dbStocks ở cấp độ thứ ba tôi cũng không thể tìm thấy ở mức độ nhẹ nhất. đã tìm thấy thứ hai cấp độ. bản chúng tôi đã tìm ra vấn đề và nó cũng đồng thời giải quyết hiện tượng tăng đột biến trong chương trình.

4. Giải thích

Biết rằng độ phức tạp cao, độ tối ưu hướng là giảm độ phức tạp về thời gian và giảm O(N3) xuống O(N). Phương pháp này được sử dụng Từ điển hoặc HashSet để lưu trữ trước dữ liệu trước vòng lặp sâu và vòng lặp biến thể for next to the field Tìm kiếm khóa và tìm kiếm khóa là O(1).

Mã tham chiếu Cho mọi khái niệm macro như sau:


public class GoodsInfo { public int Spid { get; } // Các thuộc tính khác... } public class Stock { public int Spid { get; (N^2) phương thức tìm kiếm phức tạp public List FindMatchingGoodsInfoO_N2(Danh sáchthông tin hàng hóa, danh sách stock, int targetSpid) { Danh sách kết quả = Danh sách mới(); foreach (var goodInfo ingoodsInfos) { foreach (var stock in stock) { if (goodsInfo.Spid == stock.Spid && stock.Spid == targetSpid) { result .Add(goodsInfo); về } // Tìm kiếm phương thức tạp chất O(N) được ưu tiên hóa tối ưu Danh sách công khai FindMatchingGoodsInfoO_N(Danh sáchthông tin hàng hóa, danh sách stock, int targetSpid) { HashSet stockSpids = HashSet mới(stocks.Select(s => s.Spid)); Danh sách kết quả = Danh sách mới(); foreach (vargoodInfo ingoodsInfos) { if (stockSpids.Contains(goodsInfo.Spid) &&goodInfo.Spid == targetSpid) { result.Add(goodsInfo);

Bạn có thể thấy chatgpt rất thông minh và sử dụng HashSet để diệt trừ tà ác.

Ba: Tóm tắt

Thành thật mà nói, trước đây tôi mời chào phải những tai nạn sản xuất như thế này trong các dự án của công ty. Chúng ta đều được viết vàng và làm thêm giờ. không sau .

Nếu Bạn muốn biết thêm về CPU phân tích nhiệm vụ của một trang web Dược phẩm thương mại điện tử .NET, vui lòng tìm kiếm các bài viết của CFSDN.

56 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress