8000 [VarDumper] Allow seamless use of Data clones by nicolas-grekas · Pull Request #21638 · symfony/symfony · GitHub
[go: up one dir, main page]

Skip to content

[VarDumper] Allow seamless use of Data clones #21638

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Feb 27, 2017

Conversation

nicolas-grekas
Copy link
Member
@nicolas-grekas nicolas-grekas commented Feb 16, 2017
Q A
Branch? master
Bug fix? no
New feature? yes
BC breaks? no
Deprecations? yes
Tests pass? yes
Fixed tickets -
License MIT
Doc PR -

By implementing ArrayAccess, Countable, IteratorAggregate, __get, __isset and __toString, VarDumper's Data objects become seamless and behave almost identically from their original clones values, especially from the PoV of Twig.

In data collectors, this allows replacing the many nested calls to cloneVar by a single one.

This makes the code simpler, and should make a significant difference in term of performance.

Todo:

  • push a Blackfire profile comparison
  • double check that the profiler works as expected.

@nicolas-grekas
Copy link
Member Author
nicolas-grekas commented Feb 20, 2017

Note that this PR is a follow up of #19986 and #20675.
Note also that in this PR, I removed any limits on the number of collected items. This adds much more details to the nested structures of profiler panels.

I tried this on Symfony Demo, route admin_post_new. The new behavior is enligthened by the increase of the number of calls to the AbstractCloner::castObject method. The net result is a ~20% slow down, as we do more:
https://blackfire.io/profiles/compare/1dd13c84-d3be-4697-856d-7e57c381b856/graph

Now, if we remove the same limits on master, the profile shows a ~30% increase:
https://blackfire.io/profiles/compare/43c2e0b8-0675-4a45-93d5-387d561623c6/graph

Before trying to add some limits again to fit the same performance budget as already on master, could someone try this patch on a form-heavy page?
@gharlan especially since you reported #19978.
Here is the patch against 3.2 to help testing:
3.2...nicolas-grekas:data-get32

@lyrixx
Copy link
Member
lyrixx commented Feb 20, 2017

I did not review the code, but I'm 👍 for the feature.

@@ -40,7 +38,7 @@
/**
* @var ClonerInterface
*/
private $cloner;
private static $cloner;
Copy link
Member
@stof stof Feb 20, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why making it static ?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

because there is no state in it, and each datacollector is currently instanciating its own cloner, which I measured as a free-to-save overhead (addCasters being the "heavy" loop that takes some time).

@nicolas-grekas nicolas-grekas force-pushed the data-get branch 2 times, most recently from 41ddec9 to 9f0a245 Compare February 21, 2017 07:40
@nicolas-grekas nicolas-grekas force-pushed the data-get branch 3 times, most recently from 45d6e29 to f7fa04b Compare February 27, 2017 19:45
@nicolas-grekas
Copy link
Member Author

Here we are, PR is ready, and Blackfire is great! It allowed me to find nested problems.

capture du 2017-02-27 20-46-35

https://blackfire.io/profiles/compare/afd80c91-2d53-4104-9f4d-7fbc04e86b46/graph

@fabpot
Copy link
Member
fabpot commented Feb 27, 2017

Thank you @nicolas-grekas.

@fabpot fabpot merged commit ab716c6 into symfony:master Feb 27, 2017
fabpot added a commit that referenced this pull request Feb 27, 2017
…-grekas)

This PR was merged into the 3.3-dev branch.

Discussion
----------

[VarDumper] Allow seamless use of Data clones

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | no
| New feature?  | yes
| BC breaks?    | no
| Deprecations? | yes
| Tests pass?   | yes
| Fixed tickets | -
| License       | MIT
| Doc PR        | -

By implementing `ArrayAccess`, `Countable`, `IteratorAggregate`, `__get`, `__isset` and `__toString`,  VarDumper's `Data` objects become seamless and behave almost identically from their original clones values, especially from the PoV of Twig.

In data collectors, this allows replacing the many nested calls to `cloneVar` by a single one.

This makes the code simpler, and should make a significant difference in term of performance.

Todo:
- [x] push a Blackfire profile comparison
- [x] double check that the profiler works as expected.

Commits
-------

ab716c6 [VarDumper] Allow seamless use of Data clones
@nicolas-grekas nicolas-grekas deleted the data-get branch February 27, 2017 22:43
fabpot added a commit that referenced this pull request May 1, 2017
…(ogizanagi)

This PR was merged into the 3.3-dev branch.

Discussion
----------

[Profiler] DataCollector: Remove unused static property

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | no
| New feature?  | no
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | N/A
| License       | MIT
| Doc PR        | N/A

Unless I missed something, any usage of this property were removed in #21638.

Commits
-------

96743e6 [Profiler] DataCollector: Remove unused static property
@fabpot fabpot mentioned this pull request May 1, 2017
nicolas-grekas added a commit that referenced this pull request May 28, 2017
…orm profiler (HeahDude)

This PR was merged into the 3.3 branch.

Discussion
----------

[WebProfilerBundle] Fixed options stub values display in form profiler

| Q             | A
| ------------- | ---
| Branch?       | 3.3
| Bug fix?      | yes
| New feature?  | no
| BC breaks?    | no
| Deprecations? | no <!-- don't forget updating UPGRADE-*.md files -->
| Tests pass?   | yes
| Fixed tickets | ~
| License       | MIT
| Doc PR        | ~

Since 3.3 and #21638, serializing form options gives either a `CutStub` instance or a simple var, ref ab716c6#diff-78ea21636d0319e1c804ccc1a33f68f3R271.

This breaks the form profiler panel.

Commits
-------

5e6b3a5 Fixed options stub values display in form profiler
fabpot added a commit that referenced this pull request Jun 3, 2017
…ons (ogizanagi)

This PR was merged into the 3.3 branch.

Discussion
----------

[Form][Profiler] Fixes form collector triggering deprecations

| Q             | A
| ------------- | ---
| Branch?       | 3.3 <!-- see comment below -->
| Bug fix?      | yes
| New feature?  | no <!-- don't forget updating src/**/CHANGELOG.md files -->
| BC breaks?    | no
| Deprecations? | no <!-- don't forget updating UPGRADE-*.md files -->
| Tests pass?   | yes
| Fixed tickets | N/A <!-- #-prefixed issue number(s), if any -->
| License       | MIT
| Doc PR        | N/A

Since 3.3, if you inspect your logs when accessing the form profiler panel, you'll see some of these:

```sh
php.INFO: User Deprecated: The Symfony\Bundle\WebProfilerBundle\Twig\WebProfilerExtension::dumpValue() method is deprecated since version 3.2 and will be removed in 4.0.
[...] at /src/Symfony/Bundle/WebProfilerBundle/Twig/WebProfilerExtension.php:119
```

The [WebProfilerExtension](https://github.com/symfony/symfony/blob/master/src/Symfony/Bundle/WebProfilerBundle/Twig/WebProfilerExtension.php#L73) is still using a `ValueExporter` instance for BC reasons when the $value ins't an instance of `Data` and this BC layer will be removed in 4.0 (so it'll throw an exception/error when trying to use it with something else than a `Data` instance).

The issue is since #21638, collectors (including forms one) have been drastically simplified to leverage the "seamless usage of Data clones", which is great!... But there is a slightly different implementation between `Data::seek()` and [`Data::__get()`](https://github.com/symfony/symfony/blob/master/src/Symfony/Component/VarDumper/Cloner/Data.php#L123-L130). There are probably good reasons for this, but it prevents from using classic Twig property access when the underlying data may be a scalar (`null`, `false`, ...).

I already spot that while working on the [Validator panel](https://github.com/symfony/symfony/pull/22554/files#diff-deac3c5ce4aa87243093dcd6a3f77a56R84). Perhaps there is a better solution, though.

Anyway, current `master` is currently broken, as it still tries to use the `ValueExporter`, which is already removed. And removing the BC layer in `WebProfilerExtension` isn't enough for now. It needs this fix.

BTW it also fixes rendering of the concerned inlined-dumps:

|Before|After|
|--|--|
|<img width="818" alt="screenshot 2017-06-03 a 13 35 25" src="https://cloud.githubusercontent.com/assets/2211145/26753222/01a692e6-4862-11e7-90d5-9cc9e4832648.PNG">|<img width="817" alt="screenshot 2017-06-03 a 13 35 47" src="https://cloud.githubusercontent.com/assets/2211145/26753224/090d5d6c-4862-11e7-87c1-73d5346f602c.PNG">|

Commits
-------

9de898d [Form][Profiler] Fixes form collector triggering deprecations
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants
0