Just want to clarify that when I mentioned the use of memory, I wrote down
the function "memory_get_usage()", which basically gives us the memory
handle by php that is related to the memory_limit INI setting.

Now I will provide a benchmark I have done really quick:

# Code used (I have the implementation of is_json() done already)

<?php
// make sure you set your memory limit to -1 before running this code
// Here we create a very very very big json string, really big
$limit = 1000000;
$jsonString = '{ "test": { "foo": "bar" },';

for ($i=0; $i < $limit; $i++) {
  $jsonString .= " \"test$i\": { \"foo\": { \"test\" : { \"foo\" :  {
\"test\" : { \"foo\" : \"bar\" }}}}},";
}

$jsonString .= ' "testXXXX": { "foo": "replaceme" } }';
//{ "test" : { "foo" : "bar" }}}

$memoryBefore = memory_get_usage(true) / 1024 / 1024;
echo "Megas used before call: " . $memoryBefore . PHP_EOL;

$start = microtime(true);

json_decode($jsonString, null, $limit, 0);
//<------------------ un/comment to show/hide results for json_decode()
//is_json($jsonString);
 //<------------------ un/comment to show/hide results for is_json()

$memoryAfter = memory_get_usage(true) / 1024 / 1024;
echo "Megas used after call: " . $memoryAfter . PHP_EOL;

echo "Difference: " . ($memoryAfter - $memoryBefore) . PHP_EOL;

echo "Time: " . (microtime(true) - $start) . " seconds" . PHP_EOL;
return;

# Results
## json_decode()
Megas used before call: 79.23828125
Megas used after call: 3269.23828125
Difference: 3190
Time: 12.091101884842 seconds

## is_json()
Megas used before call: 79.23828125
Megas used after call: 79.23828125
Difference: 0
Time: 5.4537169933319 seconds


And yes, I am open to share the implementation, but after I write the RFC.

Thanks for taking your time to give me a feedback.

El sáb, 30 jul 2022 a las 3:50, Jordan LeDoux (<jordan.led...@gmail.com>)
escribió:

>
>
> On Fri, Jul 29, 2022 at 7:27 AM juan carlos morales <
> dev.juan.mora...@gmail.com> wrote:
>
>> # Why this function ?
>>
>> At the moment the only way to determine if a JSON-string is valid we have
>> to execute the json_decode() function.
>>
>> The drawback about this, is that json_decode() generates an in memory an
>> object/array (depending on parameters) while parsing the string; this
>> leads
>> to a memory usage that is not needed (because we use memory for creating
>> the object/array) and also can cause an error for reaching the
>> memory-limit
>> of the php process.
>>
>> Sometimes we just need to know is the string is a valid json or not, and
>> nothing else.
>>
>
> You say that you have a first-pass at the implementation done. I'd be
> curious to see it. My initial thought was that in order to validate the
> string, you likely need to allocate extra memory as part of the validation
> that depends on the string size. You'd definitely save the overhead of a
> ZVAL, but for such an object that overhead is likely negligible.
>
> So I guess my question would be: in the actual implementation that lands,
> how much memory would this actually save compared to json_decode()? This
> seems like it would make the RFC tricky, as the purported benefit of the
> RFC depends very tightly on the implementation that lands.
>
> Jordan
>

Reply via email to