[ https://issues.apache.org/jira/browse/ARROW-621?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Wes McKinney updated ARROW-621: ------------------------------- Description: For performance-sensitive dynamic dispatch, the current visitor pattern may be suboptimal due to having two virtual function dispatches per invocation. For example, we might have: {code} ArrayVisitor* visitor = ...; RETURN_NOT_OK(array->Accept(visitor)); {code} For certain types of visitors, it may be possible to create a reusable pattern like: {code:language=c++} template <typename VISITOR> Status VisitArrayInline(const Array& array, VISITOR* visitor) { switch(array.type_id()) { case UINT8: return visitor->Visit(static_cast<const UInt8Array&>(array)); ... default: break; } return Status::NotImplemented("Array type not implemented"); } {code} It would be useful to have an understanding of how this design pattern realistically impacts performance in canonical Arrow use cases (e.g. IPC record batch loading / unloading). was: For performance-sensitive dynamic dispatch, the current visitor pattern may be suboptimal due to having two virtual function dispatches per invocation. For example, we might have: {code} ArrayVisitor* visitor = ...; RETURN_NOT_OK(array->Accept(visitor)); {code} For certain types of visitors, it may be possible to create a reusable pattern like: {code:language=c++} template <typename VISITOR> Status VisitArrayInline(const Array& array, VISITOR* visitor) { switch(array->type_id()) { case UINT8: return visitor->Visit(static_cast<const UInt8Array&>(array)); ... default: break; } return Status::NotImplemented("Array type not implemented"); } {code} It would be useful to have an understanding of how this design pattern realistically impacts performance in canonical Arrow use cases (e.g. IPC record batch loading / unloading). > [C++] Implement an "inline visitor" template that enables > visitor-pattern-like code without virtual function dispatch > --------------------------------------------------------------------------------------------------------------------- > > Key: ARROW-621 > URL: https://issues.apache.org/jira/browse/ARROW-621 > Project: Apache Arrow > Issue Type: New Feature > Components: C++ > Reporter: Wes McKinney > > For performance-sensitive dynamic dispatch, the current visitor pattern may > be suboptimal due to having two virtual function dispatches per invocation. > For example, we might have: > {code} > ArrayVisitor* visitor = ...; > RETURN_NOT_OK(array->Accept(visitor)); > {code} > For certain types of visitors, it may be possible to create a reusable > pattern like: > {code:language=c++} > template <typename VISITOR> > Status VisitArrayInline(const Array& array, VISITOR* visitor) { > switch(array.type_id()) { > case UINT8: > return visitor->Visit(static_cast<const UInt8Array&>(array)); > ... > default: > break; > } > return Status::NotImplemented("Array type not implemented"); > } > {code} > It would be useful to have an understanding of how this design pattern > realistically impacts performance in canonical Arrow use cases (e.g. IPC > record batch loading / unloading). -- This message was sent by Atlassian JIRA (v6.3.15#6346)