NX Lab

Đo thời gian chạy từng bước của script NX để tìm đoạn gây chậm

#Python#Hiệu năng2 lượt xem

  1. Quản trị viênQuản trị· 0 điểm

    Câu hỏi ·

    Script xử lý 500 file chạy mất 2 giờ thì phải biết thời gian đi đâu. Một bộ đếm thời gian nhỏ dùng cho từng bước giúp tìm chỗ nghẽn trước khi tối ưu.

    Đo thời gian chạy từng bước của script NX… Đo thời gian chạy từng bước của script NX…

    Các bước thực hiện

    1. Tạo bộ đếm. Dùng time.perf_counter() lấy mốc chính xác.
    2. Bọc từng bước. Dùng context manager with để tự đo và in.
    3. Cộng dồn. Lưu tổng thời gian theo tên bước.
    4. In bảng tổng kết. Sắp xếp giảm dần theo thời gian.
    5. Tối ưu có mục tiêu. Chỉ sửa bước chiếm nhiều thời gian nhất.

    Code tham khảo (Python)

    import time
    import NXOpen
    from contextlib import contextmanager
    
    THONG_KE = {}
    
    @contextmanager
    def do_thoi_gian(ten):
        bat_dau = time.perf_counter()
        try:
            yield
        finally:
            THONG_KE[ten] = THONG_KE.get(ten, 0.0) + (time.perf_counter() - bat_dau)
    
    def in_tong_ket(lw):
        lw.WriteLine("--- Thời gian theo bước ---")
        tong = sum(THONG_KE.values()) or 1.0
        for ten, giay in sorted(THONG_KE.items(), key=lambda kv: -kv[1]):
            lw.WriteLine("%-24s %8.3f s  %5.1f%%" % (ten, giay, 100.0 * giay / tong))
    
    def main():
        session = NXOpen.Session.GetSession()
        lw = session.ListingWindow
        lw.Open()
        part = session.Parts.Work
        if part is None:
            return
        with do_thoi_gian("Duyệt feature"):
            so_feature = sum(1 for _ in part.Features)
        with do_thoi_gian("Duyệt body"):
            so_body = sum(1 for _ in part.Bodies)
        with do_thoi_gian("Duyệt expression"):
            so_exp = sum(1 for _ in part.Expressions)
        lw.WriteLine("Feature=%d, Body=%d, Expression=%d" % (so_feature, so_body, so_exp))
        in_tong_ket(lw)
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • time.perf_counter() là đồng hồ độ phân giải cao, phù hợp đo khoảng ngắn.
    • @contextmanager giúp viết with do_thoi_gian(...) gọn, kể cả khi bước đó ném lỗi.
    • Bảng kết quả cho biết phần trăm để thấy ngay bước nào đáng tối ưu.

    Lỗi thường gặp

    • Đo trong lần chạy đầu thường chậm do NX nạp dữ liệu; chạy hai lần và so sánh.
    • Đừng đo từng phần tử nhỏ trong vòng lặp lớn; chính việc đo cũng tốn thời gian.

    Code mang tính tham khảo, viết cho NX 12 trở lên (Python journal). Tên menu và một số lớp có thể khác theo phiên bản NX; hãy chạy thử trên bản sao của chi tiết trước khi dùng cho dữ liệu thật.

    Điểm: 0

Trả lời

Đăng nhập để tham gia thảo luận.