2009-06-16 3 views
0

단일 웹 요청의 경우 외부 시스템에서 1000 개가 넘는 데이터 행을 가져오고 데이터를 표시하기 전에 더 나은 표현 형식으로 데이터의 형식을 다시 지정해야합니다 웹 페이지의 최종 사용자에게ASP.Net : 촘촘한 루프 프레젠테이션 계층에서

ASPX 페이지의 데이터를 반복 할 때 CPU의 95 % 이상을 사용하는 하드 루프 (또는 꽉 루프)가 생성됩니다.

CPU 스파이크를 피하고 프로세스를 가능한 빨리 완료하려면 어떻게해야합니까? TIA

+0

CPU가 완전히로드되었으므로 수행 할 수있는 유일한 방법은 로컬 변환을 수행하는 알고리즘 (및 코드)을 최적화하는 것입니다. 그러나 프로그램이 완전히 CPU에 바인딩되어 있다면 원하는대로 정확하게 수행 할 수 있습니다 .... –

답변

4

당신은 여기에 어떤 노력을 중복 덜 작업을 수행

  • 주문 더 많은 서버 빠른 서버를 구입? 동일한 데이터에 대한 후속 요청에서 동일한 1000 행입니까? 그러면 결과를 캐시해야할까요? 계산 중 일부는 반복해서 동일합니까? 그렇다면 원시 데이터와 함께 계산 결과를 저장해야합니다.

    결론 : 프레젠테이션 계층에서 엄격한 루프를 수행하지 마십시오. 그것은 거기에 속하지 않습니다.

    또한 확장성에 어려움이 있습니다. 당신은 다른 요청을 처리 할 수있는 작업자 스레드를 묶어 놓고 있습니다. 아마도 다른 CPU 루프가 빡빡한 CPU 루프에 있지 않을 수도 있습니다.

  • +0

    Thx, 우리는 현재 캐싱 솔루션을 사용하고 있습니다. 왜 프레젠테이션 레이어의 빡빡한 루프가 올바르지 않은지 궁금한 점이 있습니다. 우리의 경우 루핑은 데이터를 좀 더 표현할 수있는 형식으로 포맷하는 것입니다 (또는 필요한 경우 빡빡한 루프가 들어가는 레이어는 무엇입니까?) TIA – Kishork

    +1

    ASP.NET 프로그램에서 올바르지 않은 것이 더 있습니다. 이 요청을하는 동안 희소 한 작업자 스레드를 묶어두고 있으며,이 작업은 다른 곳에서도 거의 수행되어야합니다.엄격한 CPU 루프는 요청의 세부 사항에 어느 정도 영향을 줍니까? 1000 줄이 처리되는 요청이 변경됩니까? 요청이 엄격한 루프에서 사용되는 알고리즘을 변경합니까? 각 행의 처리가 다른 행과 독립적입니까? 그렇다면 미리 포맷 된 행을 반환하면됩니다. –

    1

    John 's # 3을 기반으로 구축하면 실제로 1000 행의 데이터가 필요합니까? 그건 많이 들리는데. 사용자는이를 수동으로 분류하지 않아도됩니다. 한 번에 화면에 표시된 양을 줄이는 페이징 또는 검색 기능을 제공하는 것이 좋습니다. 이미 적은 수의 레코드로 컴파일하는 경우 데이터베이스에서보다 효율적으로 수행 할 수 있습니다.

    +0

    @Joel, 나는 그가 1000 개의 행에 대해 많은 처리를해야하고, 1000 개의 행보다 훨씬 적은 행을 표시하기를 바랬다. 만약 그가 정말로 1000 개를 모두 보여 주었다면, 많은 시간을 할애하여 그 후에 많은 것을 할 수 있습니다. –

    1

    복잡한 작업을 수행하지 않는 한, 단지 1000 개의 행을 처리하는 데 걸리는 시간이 눈에 띄게 CPU 속도가 얼마나 빨랐는지 궁금 할 것입니다. 데이터가 이미 메모리에있는 한 매우 짧은 기간에 현대 서버에서 심각한 작업을 수행 할 수 있습니다.

    사전을 사용할 때 항목이 반복적으로 반복되는 것과 같은 일을하고 있습니까 (예 : 중첩 루프). 수행중인 작업을 자세히 살펴보고 각 코드 행이 실제로 실행되는 횟수를 고려하십시오.

    지난 주에 작업 한 일부 코드는 약 500,000 개의 객체에 대한 일련의 복잡한 보안 규칙을 평가해야했습니다. 최종 코드는 DB에서로드하는 데 2 ​​분, 처리하는 데 10 분, 결과 파일에 결과를 기록하는 데 1 분 20 초가 소요되는 데 약 3.5 분이 걸렸습니다. 일단 메모리에 모든 것이 있으면, 필요 이상으로 데이터를 반복하지 않는다면 놀라 울 정도로 빠르다.

    관련 문제