The render_time metric is set after all Views hooks have been executed for a single View. Is there anyway to access this timing using a standard API function?

CommentFileSizeAuthor
#6 views-render_time_metric-1809510-6.patch663 byteserikwebb
Support from Acquia helps fund testing for Drupal Acquia logo

Comments

dawehner’s picture

Status: Active » Fixed

You can look it up on the view object: $view->render_time.

erikwebb’s picture

Status: Fixed » Needs work

The problem is that $view->render_time is not available during hook_views_post_(build|execute|render). I even looked for it in template_process_views_view(), but it still was not set there either. The only way I was able to retrieve this metric was by overriding the theme function, which doesn't seem like the right solution.

dawehner’s picture

Mh good point.

I'm wondering whether hook_views_post_render should maybe fired after measuring the render_time, do you have an oppinion about that?

One thing you could do, but pssst you could alter the $view object and maybe replace it
with a decorator version/ a which which extends the normal view class.

If you do this you could fire some hook or something similar later.

erikwebb’s picture

I guess it depends on if we consider "render time" to include only the time required for Views to render the output or if we want to include any work done by modules in hook_views_post_render() implementations. I'm comfortable with this switch, but I'm not sure if there are any implications that I may not be familiar with.

dawehner’s picture

At least at the moment probably not may people are using the render time on actual live installations, but just in the admin interface
, so it seems to be safe for me to move this property up. With this hook_views_pre_view and hook_views_post_render you could
even build your own measurement, just throwing out some ideas.
We have considered to remove this property totally for live-views in d8, but that's not decided/done yet, but it's good
to know an actual usecase.

Regarding the decorator idea, here is a short codesnippet. I'm not sure about the performance implications, but they simply can't be positive :) Once you have this decorator in place, you can change the way for example the render method works.

class foo {
  var $test;
}

class fooDecorator {
  var $foo;
  public function __construct(foo $foo) {
    $this->foo = $foo;
  }
   public function __get($key) {
     return $this->foo->{$key};
   }
   public function __set($key, $value) {
     $this->foo->{$key} = $value;
   }
  public function __call($method, $args) {
    return call_user_func_array(array($this->foo, $method), $args);
  }
}

$foo = new foo();
$foo->test = 123;

replace($foo);

dsm($foo->test);

function replace(&$foo) {
  $foo = new fooDecorator($foo);
}


erikwebb’s picture

Title: Accessing render time performance metric » Make render time performance metric accessible in hook_views_post_render()
Category: support » feature
Status: Needs work » Needs review
FileSize
663 bytes

Searching drupalcontrib.org for implementations of hook_views_post_render(), I actually don't see any. I think we can go ahead and move where this value is set.

erikwebb’s picture

Long-term I'd like to use this metric to analyze the performance of individual Views on a site. Currently it's difficult to do that using something like New Relic or XHProf, because the function calls are all mostly the same.

For the sake of completeness, here is an example as I see it being used -

function mymodule_views_post_render(&$view) {
  // This could easily be replaced with a function to record the stat for analysis later.
  drupal_set_message(t('View %view render time: @time ms.', array('%view' => $view->name, '@time' => intval($view->render_time * 100000) / 100)));
}
dawehner’s picture

Version: 7.x-3.x-dev » 8.x-3.x-dev
Status: Needs review » Patch (to be ported)

Committed this patch to 7.x-3.x

In drupal8 we actually try to remove this completly because we nether thought that this will be used on the actual live site, see #1811982: Remove ui preview logic viewExecuteable::render() and move it to viewUI. Your oppinion. is greatly appreciated.

erikwebb’s picture

I use it frequently for performance tuning. I'm actually working on a benchmarking module (sandbox) that can be used to log the individual performance of Views - http://drupal.org/sandbox/erikwebb/1812092

Using something like XHProf or XDebug Profiler, it is often difficult to figure out exactly which View is the culprit. We need these metrics to make sure that we can differentiate the performance of specific Views.

dawehner’s picture

I see the point totally, but in theory your module could use the views hooks to start/end some timing on the view object.
It seems to be that you vote against removing this part out of the actual executing of a view, maybe we should make it optional?

erikwebb’s picture

I would argue that it should be optional (and disabled by default, like now), but I wouldn't want to remove those statistics from the core Views module.

I agree that my implementation can be done in a different way, so I'm fine with this approach being outdated in the next release.

xjm’s picture

Project: Views (for Drupal 7) » Drupal core
Version: 8.x-3.x-dev » 8.x-dev
Component: Code » views.module
kim.pepper’s picture

Issue summary: View changes

This appears to already be before hook_views_post_build() in D8.

\Drupal\views\ViewExecutable line #1195:

    $this->built = TRUE;
    $this->build_time = microtime(TRUE) - $start;

    // Attach displays
    $this->attachDisplays();

    // Let modules modify the view just after building it.
    $module_handler->invokeAll('views_post_build', array($this));

    return TRUE;
dawehner’s picture

I guess the "render time" is now pretty much fucked up on Drupal 8, given that the actual rendering happens late via render API, so its kinda hard to measure it, especially once
we move more and more into post_render_callbacks and what not.

arihantjn53’s picture

Assigned: Unassigned » arihantjn53

Working on the backport to version 7.x

arihantjn53’s picture

Assigned: arihantjn53 » Unassigned
dhrjgpt2005@gmail.com’s picture

Working on the backport to version 7.x

dawehner’s picture

@dhrjgpt2005
You don't have this, this was committed to 7.x-3.x already.
This issue is about porting the patch to 8.0.x

dhrjgpt2005@gmail.com’s picture

@dawehner Could i go ahead with the porting the patch to 8.0.x ?

dhrjgpt2005@gmail.com’s picture

@dawehner Could you please help me on this. As i am new to this community and would like to be a part to community?

Version: 8.0.x-dev » 8.1.x-dev

Drupal 8.0.6 was released on April 6 and is the final bugfix release for the Drupal 8.0.x series. Drupal 8.0.x will not receive any further development aside from security fixes. Drupal 8.1.0-rc1 is now available and sites should prepare to update to 8.1.0.

Bug reports should be targeted against the 8.1.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.2.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.1.x-dev » 8.2.x-dev

Drupal 8.1.9 was released on September 7 and is the final bugfix release for the Drupal 8.1.x series. Drupal 8.1.x will not receive any further development aside from security fixes. Drupal 8.2.0-rc1 is now available and sites should prepare to upgrade to 8.2.0.

Bug reports should be targeted against the 8.2.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.3.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

catch’s picture

Status: Patch (to be ported) » Needs work

Version: 8.2.x-dev » 8.3.x-dev

Drupal 8.2.6 was released on February 1, 2017 and is the final full bugfix release for the Drupal 8.2.x series. Drupal 8.2.x will not receive any further development aside from critical and security fixes. Sites should prepare to update to 8.3.0 on April 5, 2017. (Drupal 8.3.0-alpha1 is available for testing.)

Bug reports should be targeted against the 8.3.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.4.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

dhrjgpt2005@gmail.com’s picture

@dawehner it seems that the patch is already there in 8.3.x, with $this->build_time is already there. Please suggest if we still need this.

dhrjgpt2005@gmail.com’s picture

Status: Needs work » Needs review
dawehner’s picture

Status: Needs review » Fixed

Oh yeah that should be fine now. we apply this now inside \Drupal\views_ui\ViewUI.

Thank you for bringing this up.

Status: Fixed » Closed (fixed)

Automatically closed - issue fixed for 2 weeks with no activity.