2013-01-25 2 views
2

template engine benchmark 프로그램을 만들고 있습니다. 처음에는 렌더링 된 결과 (문자열)를 반환하여 템플릿 엔진을 테스트하도록 설계되었습니다. 그러나 일부 템플릿 작성자는 템플릿 엔진이 문자열을 결과로 반환해서는 안되며 대신 출력 스트림 또는 작성기 인스턴스를 매개 변수로 받아서 렌더링 결과를 병합해야한다고 우려합니다. 그들은 그 케이스가 템플릿 엔진이 사용되는 실제 환경을 대표한다고 주장한다.템플릿 엔진을 출력 스트림으로 렌더링하거나 문자열을 반환해야합니까?

ASAIK,이 진술은 100 퍼센트 올바르지 않습니다. Play! Framework (적어도 1.x 이상)에서는 템플릿 엔진이 String을 반환 한 다음 출력 스트림에 삽입해야합니다. 그리고 이런 식으로 정리하는 것이 합리적이라고 생각합니다. 어떤 논리 오류로 인해 템플릿 렌더링 프로세스가 실패하면 템플릿 엔진이 직접 응답을 출력하면 오류를 복구 할 수 없을지 생각하십시오. Play에서 반쯤 엉망인 데이터를 브라우저로 보내지 않고 우아한 시스템 오류 페이지로 응답 할 수 있습니다.

출력으로 직접 렌더링하는 쪽은 성능과 리소스 소비에 명백한 이점이 있습니다. 나는 템플릿 엔진 디자이너를 위해 더 좋은 방법이되어야하는지 궁금하다.

+1

스트림 추상화 (예 : [Appendable] (http://docs.oracle.com/javase/7/docs/api/java/lang/Appendable.html))는보다 유연 해지고 엔진이 결과를 생성 할 수 있습니다. RAM 또는 String 유형의 제한으로 인해 제한되지 않습니다. – McDowell

답변

1

최소 공통 분모이므로 Writer에 작성하십시오. 귀하의 알고리즘은 편의를 위해 PrintWriter에 포장하기를 원할 수도 있습니다. 따라서 FileWriter, OutputStreamWriter 또는 StringWriter을 받아 들일 수 있습니다.

문자열에 글을 쓰는 것은 나쁜 생각입니다. 실제 사용에서는 포스트 프로세싱을 위해 전체 String을 유지할 필요가 없으므로 대신 작은 논리적 조각으로 문서를 쓰거나 보낼 수 있습니다. 따라서 귀하의 메모리 소비 패턴이보다 현실적이 될 것입니다.

글쓴이를 수락하면 StringWriter를 사용하여 String을 얻을 수 있습니다. String을 사용하면 Writer (및 스트리밍 API)가 충분할지라도 영원히 메모리를 할당해야합니다.

+0

StringWriter가 메모리 소비를 저장하지 않습니다. 내부에 StringBuffer가 내장되어 있습니다. –

+0

질문에서 제기 된 오류 복구 문제를 해결하지 못했습니다. 그리고 현실 세계에서 String을 유지하는 것은 결코 일어난 것이 아닙니다. http 요청 매개 변수가 동일하면 제어기를 전달하고 엔진을 렌더링하여 캐시 시스템을 사용할 수 있다고 생각하십시오. 그런 다음 문자열을 응답에 직접 넣습니다. 이것은 Play 프레임 워크에서도 마찬가지입니다. @CacheFor annotation은이 목적을 위해서 있습니다. –

+0

String을 필요로한다면, 여전히 똑같이 비싸지 만 생산하기 쉽고, 필요가 없다면 그 메모리를 할당한다.이 의견에서 캐싱과 오류 제어 (거대한 템플릿 수용을 거부 함)는 스트리밍 API의 이점을 필요로하지 않는다고 주장하지만 괜찮습니다.하지만 여전히 최상의 디자인 선택입니다. 프로젝트가 진화합니다. 1 일째부터 자신의 String을 구축하면 유연성이 떨어집니다. –

1

내 의견으로는 문자열을 반환하면 성능상의 문제가 발생할 수 있습니다 (출력 대기 시간에서 누군가가 거대한 서식 파일을 작성할 때 메모리 문제에 최대한 빨리 응답해야 할 때). .

나는 회복 할 수없는 오류 지점에도 동의하지 않습니다. 예를 들어 템플리트 엔진에 구성 옵션을 추가하여 진행중인 템플리트를 "버퍼링"할 수 있습니다 (파일/메모리에 버퍼 된 출력 스트림을 사용하고 완료 될 때까지 "실제"출력 스트림에 아무 것도 쓰지 않음). 이 모드에서는 동일한 오류 로직을 구현할 수 있습니다. 물론,이 모드는 기본적으로 꺼져 있어야합니다 (perfomance 용).

+0

누군가 큰 글을 쓰는 것은 토론의 범위를 벗어납니다. 템플릿을 쓰는 것은 프로젝트의 통제하에 있습니다. 거대한 템플릿을 작성하기 때문에 거대한 프로그램과 나쁜 프로그램, 그리고 잘못된 프로그램을 작성할 수 있습니다. 이것들은 템플릿 엔진이 다루어야하는 것이 아닙니다. –

+0

버퍼링 된 출력 스트림은 동일한 양의 메모리를 소비하며, 꺼지면 오류가 다시 손실됩니다. 따라서 귀하의 제안은 귀하가 실적을 가지고 있거나 귀하가보다 견고한 시스템을 보유하고있는 것입니다. –

+0

@green - _or_ 사용자가 디스크에 버퍼링하여 버퍼링 및 견고성을 얻지 만 (성능은 느려짐) – radai

관련 문제